Javascript 如何在MongoDbB的对象列表中使用查找?

Javascript 如何在MongoDbB的对象列表中使用查找?,javascript,mongodb,Javascript,Mongodb,因此,我有一个类似这样的模式: { things: [{ details: ObjectId("id_from_things_database"), quantity: Number }] } 因此,有详细信息(对其他集合的引用)和数量的对象列表。我想做的是查找详细信息,同时保留数量。然而,我不知道如何做到这一点。这是一个我迄今为止所得到的例子 {$lookup: { from: "things", localField: "th

因此,我有一个类似这样的模式:

{
    things: [{
        details: ObjectId("id_from_things_database"),
        quantity: Number
    }]
}
因此,有详细信息(对其他集合的引用)和数量的对象列表。我想做的是查找详细信息,同时保留数量。然而,我不知道如何做到这一点。这是一个我迄今为止所得到的例子

{$lookup: {
    from: "things",
    localField: "things.details",
    foreignField: "_id",
    as: "things.details"
}},
我不知道如何在数组中查找该字段并维护quantity字段。我总是以事物结束。细节是一个数组。感谢您的帮助

理想输出:

{
    things: [{
        detailField1: "something",
        detailField2: "something else",
        quantity: 5
    }]
}
同样正常输出:

{
    things: [{
        details:{
            detailField1: "something",
            detailField2: "something else",
        },
        quantity: 5
    }]
}

在执行
$lookup
之前,需要使用
$unwind

db.getCollection('Test').aggregate([
    {$unwind: "$things"},
    {$lookup: {
        from: "things",
        localField: "things.details",
        foreignField: "_id",
        as: "things.details"
    }},
    { $group: { _id: "$_id", things: { $push: "$things" } }  }
])
你会得到这样的东西

{
"_id" : ObjectId("5e8ec3c8005e625a6237d2e4"),
"things" : [ 
    {
        "details" : [ 
            {
                "_id" : ObjectId("5e8ec370005e625a6237d2e2"),
                "name" : "Test1",
                "detail1" : "d1",
                "detail2" : "d2"
            }
        ],
        "quantity" : 7.0
    }
]

}

在执行
$lookup
之前,您需要使用
$unwind

db.getCollection('Test').aggregate([
    {$unwind: "$things"},
    {$lookup: {
        from: "things",
        localField: "things.details",
        foreignField: "_id",
        as: "things.details"
    }},
    { $group: { _id: "$_id", things: { $push: "$things" } }  }
])
你会得到这样的东西

{
"_id" : ObjectId("5e8ec3c8005e625a6237d2e4"),
"things" : [ 
    {
        "details" : [ 
            {
                "_id" : ObjectId("5e8ec370005e625a6237d2e2"),
                "name" : "Test1",
                "detail1" : "d1",
                "detail2" : "d2"
            }
        ],
        "quantity" : 7.0
    }
]

}

在文章中,他们说“启动MongoDB 3.4,如果localField是一个数组,您可以将数组元素与标量foreignField进行匹配,而不需要$unwind阶段。”@Ramesh:Serkan是对的,我认为您忽略了实际问题。是的,用户需要解卷以解决他的问题(但在大型数据集上不建议这样做!!),但这个答案缺乏对文档的重新分组(因为我们通过解卷
事物
数组将一个文档分解为多个文档),这是正确的。这让我更接近它,我会玩它(也许会以某种方式再次合并?),但它并不是我想要的输出。我将用所需的输出编辑我的文章。@whoami你说这不推荐用于大型数据集,things数组永远不会是大型的,最多可能是几百个。我在Node.js中使用这个。我是否最好尝试获取两个数组,然后用JavaScript手动将它们合并在一起?@LeeMorgan我做了一个更新。为了获得预期的结果,您还需要在$lookupIn之后使用$group,他们说“启动MongoDB 3.4,如果localField是一个数组,您可以将数组元素与标量foreignField匹配,而不需要$unwind stage。”@Ramesh:Serkan是对的,我认为您忽略了实际问题。是的,用户需要解卷以解决他的问题(但在大型数据集上不建议这样做!!),但这个答案缺乏对文档的重新分组(因为我们通过解卷
事物
数组将一个文档分解为多个文档),这是正确的。这让我更接近它,我会玩它(也许会以某种方式再次合并?),但它并不是我想要的输出。我将用所需的输出编辑我的文章。@whoami你说这不推荐用于大型数据集,things数组永远不会是大型的,最多可能是几百个。我在Node.js中使用这个。我是否最好尝试获取两个数组,然后用JavaScript手动将它们合并在一起?@LeeMorgan我做了一个更新。为了获得预期的结果,您还需要在$lookup之后使用$group。实际问题与
$lookup
无关-这很好!!但问题在于将
$lookup
的结果与实际文档合并,该文档就在这里::
作为:“things.details”
它将覆盖现有的
things
字段,并将
$lookup
阶段的结果合并到一起。是的,我理解这一点。我只是想弄清楚如何完成我想做的事情。我不太明白。真正的问题不在于
$lookup
-这很好!!但问题在于将
$lookup
的结果与实际文档合并,该文档就在这里::
作为:“things.details”
它将覆盖现有的
things
字段,并将
$lookup
阶段的结果合并到一起。是的,我理解这一点。我只是想弄清楚如何完成我想做的事情。我不太明白。