[英]Mongoose Populate values and modifying the Object
我正在嘗試使用貓鼬填充查找結果。 但我面臨一個問題。
我的數據是一個產品列表,每個產品都包含一個變體列表。 假設我有一個名為 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
}
您可以使用帶有$reduce
運算符的聚合管道,但在此之前您必須填充文檔,您可以使用類似於 populate 的$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)
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.