【问题标题】:MongoDB Aggregation - How can I" $lookup" a nested document "_id"?MongoDB 聚合 - 我如何“$lookup”嵌套文档“_id”?
【发布时间】:2020-12-31 14:06:48
【问题描述】:

感谢这里的人们的帮助,我成功地在我的文档中 $lookup 两个 ID 以及他们在另一个集合中的代表文档。我需要采取的下一步是进一步查找“嵌套”ID(引用另一个集合中的文档)。

我试图简单地放置另一个 $lookup 管道,但这只是部分工作。 因此,chieftain 属性和 chieftain 的所有其他属性中包含了一个“空”文档,其中有些被删除了。

查看我当前的汇总:

db.getCollection('village').aggregate([
{
    "$match": { _id: "111" }
},
{
    "$lookup": {
        from: "character",
        localField: "chieftainId",
        foreignField: "_id",
        as: "chieftain"
    } 
},
{
     "$lookup": {
        from: "character",
        localField: "villagerIds",
        foreignField: "_id",
        as: "villagers"
    }
},
{
     "$lookup": {
        from: "bloodline",
        localField: "chieftain.bloodline",
        foreignField: "_id",
        as: "chieftain.bloodline"
    }
},
 { "$project" : { "villagerIds" : 0, "chieftainId" : 0}},
 { "$unwind" : "$chieftain" }
])

结果如下:

{
    "_id" : "111",
    "name" : "MyVillage",
    "reputation" : 0,
    "chieftain" : {
        "bloodline" : []
    },
    "villagers" : [ 
        {
            "_id" : "333",
            "name" : "Bortan",
            "age" : 21,
            "bloodlineId" : "7f02191f-90af-406e-87ff-41d5b4387999",
            "villageId" : "foovillage",
            "professionId" : "02cbb10a-6c0f-4249-a932-3f40e12d32c5"
        }, 
        {
            "_id" : "444",
            "name" : "Blendi",
            "age" : 21,
            "bloodlineId" : "b3a8ffeb-27aa-4e2e-a8e6-b382554f326a",
            "villageId" : "foovillage",
            "professionId" : "45dc9350-c84a-491d-a49a-524834dd5773"
        }
    ]
}

我希望酋长部分看起来像这样(这是没有我添加的“最后一个”$lookup 的酋长文件的样子):

"chieftain" : {
        "_id" : "222",
        "name" : "Bolzan",
        "age" : 21,
        "bloodlineId" : "7c2926f9-2f20-4ccf-846a-c9966970fa9b", // this should be resolved/lookedup
        "villageId" : "foovillage",
    },

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    在查找时,chieftan 是一个数组,因此设置 chieftan.bloodline 会将数组替换为仅包含 bloodline 字段的对象。

    { "$unwind" : "$chieftain" } 阶段移动到血统查找阶段之前,以便查找处理对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2020-07-30
      • 1970-01-01
      • 2016-12-19
      • 2020-03-08
      • 2015-05-08
      • 2020-12-29
      相关资源
      最近更新 更多