当前位置: 首页 > 知识库问答 >
问题:

MongoDB聚合-如何“$lookup”嵌套文档“_id”?

高运诚
2023-03-14

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

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"
        }
    ]
}

我希望chieftain部分是这样的(这就是没有添加'last'$lookup'的chieftain文档的样子):

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

共有1个答案

和和裕
2023-03-14

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

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

 类似资料:
  • 我有一个名为results的集合,其中每个文档都有一个标记(唯一)和一个嵌入文档(服务)列表。 样本: 我想使用mongo模板(spring boot)提取一个基于令牌和服务id的服务。下面是一个代码片段: 服务级别: 上面的代码执行此查询: 方法返回空Service对象! 为了获得服务对象,我的聚合中是否有任何更改要做?

  • 问题内容: 我如何在mongodb文档中嵌套文档的地方搜索文档。例如,我有一组私人消息。每条私人消息都有两个嵌套文档- 一个代表发送用户,另一个代表接收使用。两个嵌套文档的格式均为- userID:34343,名称:Joe Bloggs 我希望能够搜索用户发送的所有邮件(例如,搜索发件人用户的嵌套文档)。 我正在使用Java驱动程序。我是否需要创建一个代表嵌套文档的DBObject? 谢谢 问题答

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 完整示例代码: https://gist.github.com/anonymous/329EAAF5654096C529DA

  • 我有两个集合A和B,我在另一个集合B中有一个字段的引用,因此将两个结果聚合到: 集合A中的文件是:

  • 本文向大家介绍MongoDB查询中如何更新嵌套文档,包括了MongoDB查询中如何更新嵌套文档的使用技巧和注意事项,需要的朋友参考一下 要更新嵌套文档,请使用update(),并在其中使用点号。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新嵌套文档的查询- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-