路口查询:谁在我的同一个团队中?

时间:2018-08-27 14:41:18

标签: mongodb

说:用户文档类似于{_id,名称,teamIds:[...]}。

我加入了许多团队,其他人可能加入了许多其他团队。

如何找出我团队中任何一个团队的所有用户?

或者,如果设计效率不高,最好添加{teamId,userId}的集合?

2 个答案:

答案 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
            ]
        }
    ]
}