Javascript 从另一个集合MongoDB aggregate$lookup获取数据
我有以下两个系列:Javascript 从另一个集合MongoDB aggregate$lookup获取数据,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有以下两个系列:仓库和产品 仓库文档结构如下所示: { _id: ObjectId("5f17dc2309ce612aa858b625") products:[ // product is string {product: "5f17dc3a09ce612aa858b627", count: 20}, {product: "5f17dc3a09ce612aa858b628", count: 10} ]
仓库
和产品
仓库文档结构如下所示:
{
_id: ObjectId("5f17dc2309ce612aa858b625")
products:[ // product is string
{product: "5f17dc3a09ce612aa858b627", count: 20},
{product: "5f17dc3a09ce612aa858b628", count: 10}
]
}
{
_id: ObjectId("5f17dc3a09ce612aa858b627")
name: "Tomatos",
price: 5
}
产品文档结构如下所示:
{
_id: ObjectId("5f17dc2309ce612aa858b625")
products:[ // product is string
{product: "5f17dc3a09ce612aa858b627", count: 20},
{product: "5f17dc3a09ce612aa858b628", count: 10}
]
}
{
_id: ObjectId("5f17dc3a09ce612aa858b627")
name: "Tomatos",
price: 5
}
我需要使用聚合将warehouse.products.product
值替换为products
集合中id相同的产品
我认为.populate('products.product')
在使用find时运行良好//不确定//但现在需要使用聚合
我希望这是仓库收集的最终结果:
{
_id: ObjectId("5f17dc2309ce612aa858b625")
products:[
{
count:20,
product: {
name: "Tomatos",
price: 5
}
},
{
count:10,
product: {
name: "Oranges",
price: 8
}
}
]
}
我试过这个,但不起作用:
{
$lookup:
{
from: "products",
let: { "pr": "products.product"},
pipeline: [
{ $addFields: { "id": { "$toString": "$_id" }}},
{ $match: { $expr: { $eq: [ "$id", "$$pr" ] } } }
],
as: "products.product"
}
}
工作
lookup
提供了一个数组。在您的情况下,您需要产品对象。所以我希望产品总是有一个目标。这就是为什么我使用arrayElemAt
从数组中获取第一个对象,并用ifNull
包装,因为有时候产品数组可能没有元素
工作
lookup
提供了一个数组。在您的情况下,您需要产品对象。所以我希望产品总是有一个目标。这就是为什么我使用arrayElemAt
从数组中获取第一个对象,并用ifNull
包装,因为有时候产品数组可能没有元素。正常工作,但这样我会丢失仓库中的所有其他数据,我的意思是,如果它不仅仅是“\u id”和“products”的话。”。。在“产品”字段中也是如此。。如果没有id和count,则用{$unwind:{path:'$products',preserveNullAndEmptyArrays:true}}替换展开
,
没有帮助:(你可以在这里检查我添加到仓库的“name”和“opened”未出现在结果中的道具也在编辑的产品集合中数量:另外,我不想在aggreagate EDIT2中写入我希望看到的所有文件:如果可能的话,只需复制所有链接并替换warehouse.products.*每个procuts.*产品与产品集合中的相应产品这就是您想要的例如..您需要查看,当您在stackoverflow中询问任何问题时,请检查您包含的所有内容。您在主要问题中得到了回答,这是有效的,但这样我就丢失了仓库中的所有其他数据,我的意思是,如果不仅仅是“_id”和“products”。“products”中也是一样的字段..如果没有id和count,则用{$unwind:{path:'$products',preserveNullandmptyarray:true}}替换展开
,
没有帮助:(你可以在这里检查我添加到仓库的“name”和“opened”未出现在结果中的道具也在编辑的产品集合中数量:另外,我不想在aggreagate EDIT2中写入我希望看到的所有文件:如果可能的话,只需复制所有链接并替换warehouse.products.*每个procuts.*产品与产品集合中的相应产品这就是您想要的对于..您需要查看,当您在stackoverflow中询问任何问题时,请检查您包含的所有内容。您在主要问题中所问的问题都得到了回答,