Javascript Mongoose填充值并修改对象
我正在尝试使用mongoose填充查找结果。但我面临一个问题 我的数据是一个产品列表,每个产品都包含一个变体列表。假设我有一个名为Phone的产品,我有一个名为blue、black和green的变体列表。 我想做的是返回一个完整的产品列表和一个股票总数 产品对象的一个示例是:Javascript Mongoose填充值并修改对象,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在尝试使用mongoose填充查找结果。但我面临一个问题 我的数据是一个产品列表,每个产品都包含一个变体列表。假设我有一个名为Phone的产品,我有一个名为blue、black和green的变体列表。 我想做的是返回一个完整的产品列表和一个股票总数 产品对象的一个示例是: { "name" : "Phone", "details" : "blaah blaah", "variants" : [ ObjectId("5e22d3dabb6cc53debc3a
{
"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
运算符的聚合管道,但在必须填充文档之前,您可以使用类似于“填充”的$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)
})
您可以使用带有
$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)
})
我必须在你的代码中做一些更改,但它正是我想要的方式,非常感谢。我必须在你的代码中做一些更改,但它正是我想要的方式,非常感谢