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
阶段的结果合并到一起。是的,我理解这一点。我只是想弄清楚如何完成我想做的事情。我不太明白。