首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套数组中的$lookup

嵌套数组中的$lookup
EN

Stack Overflow用户
提问于 2021-02-12 00:57:32
回答 1查看 72关注 0票数 1

我需要一个MongoDB查询来从事件、用户和确认的集合中返回聚合结果。

代码语言:javascript
复制
db.events.aggregate([
  {
    "$match": {
      "_id": "1"
    }
  },
  {
    "$lookup": {
      "from": "confirmations",
      "as": "confirmations",
      "let": {
        "eventId": "$_id"
      },
      "pipeline": [
        {
          "$match": {
            "$expr": {
              "$eq": [
                "$eventId",
                "$$eventId"
              ]
            }
          }
        },
        {
          "$lookup": {
            "from": "users",
            "as": "user",
            "let": {
              "userId": "$confirmations.userId"
            },
            "pipeline": [
              {
                "$match": {
                  "$expr": {
                    "$eq": [
                      "$_id",
                      "$$userId"
                    ]
                  }
                }
              },
              
            ]
          },
          
        },
        
      ]
    }
  }
])

所需

代码语言:javascript
复制
[
  {
    "_id": "1",
    "confirmations": [
      {
        "_id": "1",
        "eventId": "1",
        "user": {
          "_id": "1",
          "name": "X"
        },
        "userId": "1"
      },
      {
        "_id": "2",
        "eventId": "1",
        "user": {
          "_id": "2",
          "name": "Y"
        },
        "userId": "2"
      }
    ],
    "title": "foo"
  }
]

除了确认数组中的嵌入式用户之外,一切都可以正常工作。我需要输出来显示confirmations.user,而不是一个空数组。

Playgound:https://mongoplayground.net/p/jp49FW59WCv

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-14 00:52:47

您在内部$lookup的变量声明中出错。尝试此解决方案:

代码语言:javascript
复制
db.events.aggregate([
    {
        "$match": {
            "_id": "1"
        }
    },
    {
        $lookup: {
            from: "confirmations",
            let: { "eventId": "$_id" },
            pipeline: [
                {
                    $match: {
                        "$expr": {
                            $eq: ["$eventId", "$$eventId"]
                        }
                    }
                },
                {
                    $lookup: {
                        from: "users",
                        let: { "userId": "$userId" },
                        pipeline: [
                            {
                                $match: {
                                    $expr: {
                                        $eq: ["$_id", "$$userId"]
                                    }
                                }
                            }
                        ],
                        as: "user"
                    }
                },
                { $unwind: "$user" }
            ],
            as: "confirmations"
        }
    }
])

此外,您可以在内部$lookup中使用$unwind代替user的:

代码语言:javascript
复制
{
    $addFields: {
        user: { $arrayElemAt: ["$user", 0] }
    }
}

因为默认情况下,$unwind不会保留来自上一阶段空结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66159177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档