嵌套localField时的$ lookup

凯尔·理查森(Kyle Richardson)

MongoDB版本3.4.10(应用程序正在使用Meteor框架)

目标:在运行时根据需要将_id引用的文档聚合到包含的文档中。

我有MaterialsModelsCatalog具有以下文档的集合:

用料

 { "_id" : "cf4KgXw7ZK6ukdzR7", "name" : "parquet_wood_mahogany" }

楷模

{
  "_id" : "Mwp5eYYZ4GZzvZuoK",
  "name" : "top_square_chamfered",
  "type" : "top"
}
{
  "_id" : "CqhS2m2RcLZ2Bm4eb",
  "name" : "skirt_square",
  "type" : "skirt"
}
{
  "_id" : "dYP22ajALnWBwpBj2",
  "name" : "leg_square",
  "type" : "leg"
}

目录

{
  "_id" : "EcRGzPAq79giYKrbY",
  ...,
  "specs" : {
    ...,
    "models" : [
      {
        "mesh" : "Mwp5eYYZ4GZzvZuoK",
        "material" : "cf4KgXw7ZK6ukdzR7"
      },
      {
        "mesh" : "CqhS2m2RcLZ2Bm4eb",
        "material" : "cf4KgXw7ZK6ukdzR7"
      },
      {
        "mesh" : "dYP22ajALnWBwpBj2",
        "material" : "cf4KgXw7ZK6ukdzR7"
      }
    ]
  }
}

汇总后所需的返回文档格式:

{
  "_id" : "EcRGzPAq79giYKrbY",
  ...,
  "specs" : {
    "dimensions" : {
      ...,
    },
    "models" : [
      {
        "mesh" : {
          "_id" : "Mwp5eYYZ4GZzvZuoK",
          "name" : "top_square_chamfered",
          "type" : "top"
        },
        "material" : {
          "_id" : "cf4KgXw7ZK6ukdzR7",
          "name" : "parquet_wood_mahogany"
        }
      },
      {
        "mesh" : {
          "_id" : "CqhS2m2RcLZ2Bm4eb",
          "name" : "skirt_square",
          "type" : "skirt"
        },
        "material" : {
          "_id" : "cf4KgXw7ZK6ukdzR7",
          "name" : "parquet_wood_mahogany"
        }
      },
      {
        "mesh" : {
          "_id" : "dYP22ajALnWBwpBj2",
          "name" : "leg_square",
          "type" : "leg"
        },
        "material" : {
          "_id" : "cf4KgXw7ZK6ukdzR7",
          "name" : "parquet_wood_mahogany"
        }
      }
    ]
  }
}

我没有包含任何查询代码,因为它与实际情况相去甚远,以至于只是噪音。我一直在尝试将aggregate,和$lookup结合使用,但是我所得到的并没有达到预期的效果。MongoDB v3.6pipeline语法将使此操作变得更加容易...但是我完全不知道v3.4。

我想尽可能避免使用多个数据库请求来合并此信息。任何建议的帮助将不胜感激!

编辑:工作解决方案-

db.catalog.aggregate([
  { "$lookup": {
    "from": 'models',
    "localField": "specs.models.mesh",
    "foreignField": "_id",
    "as": "models.mesh"
  }},
  { "$lookup": {
    "from": 'materials',
    "localField": "specs.models.material",
    "foreignField": "_id",
    "as": "models.material"
  }},
  { "$unwind": "$models.mesh" },
  { "$unwind": "$models.material" },
  { "$group":{
    "_id": "$_id",
    "title": { "$first": "$title" },
    "desc": { "$first": "$desc" },
    "thumbnail": { "$first": "$thumbnail" },
    "createdBy": { "$first": "$createdBy" },
    "createdAt": { "$first": "$createdAt" },
    "specs": { "$first": "$specs" },
    "models": { "$push": "$models" }
  }},
  { "$project": {
    "_id": "$_id",
    "title": "$title",
    "desc": "$desc",
    "thumbnail": "$thumbnail",
    "createdBy": "$createdBy",
    "createdAt": "$createdAt",
    "specs.dimensions": "$specs.dimensions",
    "specs.models": "$models",
  }}
])
阿什

您可以尝试以下汇总

db.catalog.aggregate([
  { "$lookup": {
    "from": 'models',
    "localField": "specs.models.mesh",
    "foreignField": "_id",
    "as": "models.mesh"
  }},
  { "$lookup": {
    "from": 'materials',
    "localField": "specs.models.material",
    "foreignField": "_id",
    "as": "models.material"
  }},
  { "$unwind": "$models.mesh" },
  { "$unwind": "$models.material" },
  { "$group":{
    "_id": "$_id",
    "title": { "$first": "$title" },
    "desc": { "$first": "$desc" },
    "thumbnail": { "$first": "$thumbnail" },
    "createdBy": { "$first": "$createdBy" },
    "createdAt": { "$first": "$createdAt" },
    "specs": { "$first": "$specs" },
    "models": { "$push": "$models" }
  }},
  { "$project": {
    "title": "$title",
    "desc": "$desc",
    "thumbnail": "$thumbnail",
    "createdBy": "$createdBy",
    "createdAt": "$createdAt",
    "specs.dimensions": "$specs.dimensions",
    "specs.models": "$models",
  }}
])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章