arrays - 带有嵌套文档的 $lookup

标签 arrays node.js mongodb mongodb-query aggregation-framework

我有三个集合需要加入/查找。 “团体” “用户” “链接标签” “照片”

我正在从集合组中获取所有组。

group {
    id: 1,
    start: 10.12,
    linkedUsers : [1,2,3,4,5]
}

然后我需要从用户查找/加入

user {
    id: 1,
    name: ""
}

然后从 linkedTags

tag {
    userId: 1,
    rounds: 3,
    time: 180
}

然后从“照片”

photo {
    userId: 1,
    location: ""
}

所以我需要这样:

Group {
    id: 1,
    start: 10.12,
    linkedUsers: [1,2,3,4],
    users: [
        1:{
            id: 1,
            name: "",
            rounds: 3,
            time: 180,
            photos: [
                1: {
                    id: 1,
                    location: ""
                }
            ]
        }
    ]
}

这是我到目前为止所尝试过的。我认为我需要分阶段进行,但我还没有弄清楚如何做到这一点。

  db('groups').aggregate([
    {
      $lookup: {
        from: 'users',
        localField: 'linkedUsers',
        foreignField: 'id',
        as: 'users'
      }
    },
    {
      $unwind: "$users"
    },
    {
      $lookup: {
        from: 'photos',
        localField: 'linkedUsers',
        foreignField: 'id',
        as: 'photos'
      }
    },
    {
      $unwind: "$photos"
    },
    {
      $lookup: {
        from: 'linkedTags',
        localField: 'linkedUsers',
        foreignField: 'id',
        as: 'tags'
      }
    },
    {
      $unwind: "$tags"
    },
    { $group: {
        _id: null,
        id: "$id",
        start: '$start',
        linkedUsers: "$linkedUsers",
        users: {$push: {
          id: "$users.id",
          name: "$users.name",
          rounds: "$tags.rounds",
          time: "$tags.time",
          photos: {$push: {
            id: "$photos.id",
            location: "photos.location"
          }}
        }}
    }}
  ])

编辑1: 这是我遇到的第一个错误:

MongoError:字段“id”必须是累加器对象

我已经阅读过相关内容,但我不明白它们是如何结合在一起的。

编辑 2: 我通过将分组包装在 _id 中解决了这个问题:{}

现在我遇到无法识别的表达式“$push”

编辑3: 在 Atlas 4.0.4 Enterprise 上运行。

最佳答案

您可以使用以下聚合

db.group.aggregate([
  { "$lookup": {
    "from": "users",
    "let": { "linkedUsers": "$linkedUsers" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$_id", "$$linkedUsers"] } } },
      { "$lookup": {
        "from": "tags",
        "let": { "userId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": ["$userId", "$$userId"] } } }
        ],
        "as": "tags"
      }},
      { "$lookup": {
        "from": "photos",
        "let": { "userId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": ["$userId", "$$userId"] } } }
        ],
        "as": "photos"
      }}
    ],
    "as": "linkedUsers"
  }}
])

编辑:删除了变量中的空格

关于arrays - 带有嵌套文档的 $lookup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53498454/

相关文章:

php - array_diff() 删除了太多元素

c++ - 如何在一个数组中存储两个整数 (C++)

java - 从给定句子中提取所有单词并打印它们及其辅音计数

c - 使用 malloc 和 free 理解指针

javascript - 如何跨 NodeJs 应用程序和模块正确重用与 Mongodb 的连接

mongodb - 在 VM 上托管数据库

javascript - 将 HTML 表单输入分配给 Node JS 中的变量

node.js - 使用 Multer 未将图像文件名插入到数据库中

javascript - 如何根据 url 在 Meteor 中创建集合的新副本

javascript - Meteor.js/MongoDB 日期之间的查询不返回数据