MongoDB聚合查找匹配数组

时间:2018-02-22 19:02:39

标签: mongodb aggregation-framework

我有两个集合,一个是用户集合,另一个是集合集合。在groups中,文档如下所示:

{
    "_id": ObjectId("...")
    "members": [ObjectId("..."), ObjectId("..."), ObjectId("...")]
}

users集合中,文档如下所示:

{
    "_id": ObjectId("...")
    "first_name": "...",
    "last_name": "...",
    "phone": "..."
}

我想要做的是users集合中的聚合,我将$lookup阶段添加到管道中,我进入groups集合并从用户处获取组根据用户文档中的_id是否在组文档中的members数组内。

我有以下内容,但我不知道自己该怎么做。

db.users.aggregate([
    {
        "$match": { "_id": ObjectId("...") }
    },
    {
        "$lookup": {
            "from": "groups",
            "let": {"_id": "$_id"},
            "pipeline": [{"$match": ???}], <- match when $$_id is inside $members
            "as": "group"
    }
]);

我知道MongoDB中的聚合框架不适用于数组并且有一个$unwind阶段,但我真的不知道如何组合$unwind和{ {1}}获得我想要的结果。

我想要的是什么:

$match

我使用MongoDB服务器版本3.7.2

1 个答案:

答案 0 :(得分:10)

您可以使用$lookup$lookup管道尝试以下两种方式之一的聚合。

$查找

db.users.aggregate([
  {"$match":{"_id":ObjectId(..)}},
  {"$lookup":{
    "from":"groups",
    "localField":"_id",
    "foreignField":"members",
    "as":"group"
  }},
  {"$unwind":"$group"},
  {"$unwind":"$group.members"},
  {"$match":{"group.members":ObjectId(..)}}
])

$ lookup pipeline

db.users.aggregate([
  {"$match":{"_id":ObjectId(..)}},
  {"$lookup":{
    "from":"groups",
    "let":{"_id":"$_id"},
    "pipeline":[
      {"$match":{"$expr":{"$in":["$$_id","$members"]}}},
      {"$unwind":"$members"},
      {"$match":{"$expr":{"$eq":["$$_id","$members"]}}}
    ],
    "as":"members"
  }}
])