说:用户文档类似于{_id,名称,teamIds:[...]}。
我加入了许多团队,其他人可能加入了许多其他团队。
如何找出我团队中任何一个团队的所有用户?
或者,如果设计效率不高,最好添加{teamId,userId}的集合?
答案 0 :(得分:1)
如果您的用户已被提取(很可能是这样),这非常简单。
db.users.find({_id: {$ne: me.id}, teams: {$in: me.teams}})
答案 1 :(得分:0)
假设您的用户集中有以下文档,
{
"_id" : 1.0,
"teams" : [
1.0,
5.0,
8.0,
12.0,
10.0
]
}
{
"_id" : 2.0,
"teams" : [
1.0,
2.0,
3.0,
8.0,
10.0
]
}
{
"_id" : 3.0,
"teams" : [
4.0,
7.0,
9.0,
12.0
]
}
{
"_id" : 5.0,
"teams" : [
21.0,
45.0,
85.0
]
}
,并且您想让所有共享任何团队且用户ID为1的用户。您可以使用$lookup stage:
db['users'].aggregate(
[
{
$match: {
_id:1
}
},
{
$lookup: {
from: "users",
let: { id:"$_id", team:"$teams" },
pipeline: [ {$match:{$expr:{$and:[
{$ne:["$_id","$$id"]},
{$ne:[{$setIntersection:["$teams","$$team"]},[]]}
]}}}],
as: "connected_users"
}
},
],
);
这将输出:
{
"_id" : 1.0,
"teams" : [
1.0,
5.0,
8.0,
12.0,
10.0
],
"connected_users" : [
{
"_id" : 2.0,
"teams" : [
1.0,
2.0,
3.0,
8.0,
10.0
]
},
{
"_id" : 3.0,
"teams" : [
4.0,
7.0,
9.0,
12.0
]
}
]
}