[英]Use mongoDB $lookup to find documents in another collection not present inside an array
[英]getdata from another collection MongoDB aggregate $lookup
我有以下两个collections: warehouses
和products
Warehouse 文档结构如下所示:
{
_id: ObjectId("5f17dc2309ce612aa858b625")
products:[ // product is string
{product: "5f17dc3a09ce612aa858b627", count: 20},
{product: "5f17dc3a09ce612aa858b628", count: 10}
]
}
Product 文档结构如下所示:
{
_id: ObjectId("5f17dc3a09ce612aa858b627")
name: "Tomatos",
price: 5
}
我需要使用aggregate
的products
集合中的具有相同 id 的产品替换warehouse.products.product
值。
我认为.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"
}
}
[{
$unwind: {
path: '$products'
}
}, {
$lookup: {
from: 'item',
'let': {
pr: '$products.product'
},
pipeline: [{
$match: {
$expr: {
$eq: [{
$toString: '$_id'
},
'$$pr'
]
}
}
}],
as: 'products.product'
}
}, {
$project: {
"products.count": 1,
"products.product": {
$ifNull: [{
$arrayElemAt: ["$products.product", 0]
},
{
}
]
}
}
}, {
$group: {
_id: '$_id',
products: {
$addToSet: '$products'
}
}
}]
工作Mongo游乐场
lookup
提供了一个数组。 在您的情况下,您需要产品 object。 所以我希望产品总是有一个 object。 这就是为什么我使用 arrayElemAt 从数组中获取第一个ifNull
,并用arrayElemAt
包裹,因为有时产品数组可以没有元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.