繁体   English   中英

Mongodb $lookup 使用管道的嵌套对象

[英]Mongodb $lookup nested objects with pipeline

我有以下架构Thing

{
  name: "My thing",
  files: [
    {
      name: "My file 1",
      versions: [
        {
          file_id: ObjectId("blahblahblah")
        },
        {
          file_id: ObjectId("blahblahblah")
        },
      ],
    },
    {
      name: "My file 2",
      versions: [
        {
          file_id: ObjectId("blahblahblah")
        },
        {
          file_id: ObjectId("blahblahblah")
        },
      ],
    }
  ]
}

然后我有一个File模式:

{
  _id: ObjectId("blahblah"),
  type: "image",
  size: 1234,
}

Thing模式中的file_idFile模式的_id的 REF。

我想$lookup我的Thing中的所有文件。 所以我从这个开始:

{
  "$lookup": {
    "from": "files",
    "let": { "files": "$files" },
    "pipeline": [
      { "$match": { "$expr": { "$in": [ "$_id", "$$files.versions.file_id" ] } } }.
    ],
    "as": "files.versions.file"
  }
}

但这显然是错误的。 有人可以帮忙吗?

问题是当我们$$files.versions.file_id访问 ids 时,它将返回 ids 数组数组,因此$in将不匹配嵌套的 ids 数组,

我可以看到您正在尝试在同一嵌套级别中投影文件详细信息,因此直接查找不会在嵌套数组中设置该详细信息,您必须在设置文件详细信息之前先解构数组,

  • $unwind解构files数组
  • $unwind解构versions数组
  • $lookupfiles集合并传递files.versions.file_id作为 localField
  • $unwind解构files.versions.file_id数组
  • $groupnamefile name并重新构建versions数组
  • $group仅按name并重建files数组
  { $unwind: "$files" },
  { $unwind: "$files.versions" },
  {
    $lookup: {
      from: "files",
      localField: "files.versions.file_id",
      foreignField: "_id",
      as: "files.versions.file_id"
    }
  },
  { $unwind: "$files.versions.file_id" },
  {
    $group: {
      _id: {
        name: "$name",
        file_name: "$files.name"
      },
      versions: { $push: "$files.versions" }
    }
  },
  {
    $group: {
      _id: "$_id.name",
      files: {
        $push: {
          name: "$_id.file_name",
          versions: "$versions"
        }
      }
    }
  }

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM