我正在尝试使用猫鼬填充查找结果。但是我面临一个问题。
我的数据是产品列表,每个产品都包含一个变体列表。假设我有一个名为Phone的产品,并且有一个名为blue,black和green的变体列表。 我要做的是返回完整的产品清单和库存总额。
产品对象的示例是:
{
"name" : "Phone",
"details" : "blaah blaah",
"variants" : [
ObjectId("5e22d3dabb6cc53debc3a4ae"),
ObjectId("5e23629c82aac939fe95c926")
]
}
一个变体对象的例子是
[
{
"name" : "blue",
"stocks": 14,
"cost" : 200
},
{
"name" : "black",
"stocks": 9,
"cost" : 202
}
]
当前我正在执行以下操作
router.get("/fetchProducts", (req, res) => {
Product.find({}).populate("variants")
.then(products => {
res.send(products);
}).catch(err => {
res.send(err)
})
})
但是我想添加所有变体的库存并将其附加到结果中。 像这样
{
"name" : "Phone",
"details" : "blaah blaah",
"variants" : [
{
"name" : "blue",
"stocks": 14,
"cost" : 200
},
{
"name" : "black",
"stocks": 9,
"cost" : 202
}
],
"stocks": 23
}
答案 0 :(得分:2)
您可以使用带有$reduce
运算符的聚合管道,但是在必须填充文档之前,可以使用$lookup
来进行填充,这类似于填充。这里是数据示例。我尚未测试,但我希望它能工作。
Product.aggregate([{
$lookup: {
from: "variants",
localField: "variant",
foreignField: "_id",
as:"variant"
}
}, {
"$addFields": {
"stocks": {
"$reduce": {
"input": "$variants",
"initialValue": 0,
"in": { "$add" : ["$$value", "$$this.cost"] }
}
}
}
}
]).exec(function(err, data) {
if(err) console.log(err)
console.log(data)
})