javascript - Mongoose 填充值并修改对象
问题描述
我正在尝试使用猫鼬填充查找结果。但我面临一个问题。
我的数据是一个产品列表,每个产品都包含一个变体列表。假设我有一个名为 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
运算符一起使用,但在此之前您必须填充文档,您可以执行$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)
})
推荐阅读
- jhipster - JHipster:.yo-rc.json 文件是否有参考文档?
- spring-boot - WildFly 14:org.apache.tomcat.websocket.server.WsServerContainer 类无法转换为 io.undertow.websockets.jsr.ServerWebSocketContainer 类
- android - 如何在 Android 8.1 及更高版本中更改默认通知
- mediawiki - 如何让 MediaWiki 搜索忽略重音符号?
- c++ - OpenGL 2D modelToWorld 矩阵不起作用
- c++ - 虚拟继承不适用于特定的 g++ 版本
- laravel - Laravel 5.7 未定义变量
- javascript - 我如何为我访问的每个页面执行这行代码,而不是在我单击书签时?
- r - 修改现有代码以将 geom_count 插入 ggplot
- ubuntu - 如何使用 MIPI 相机在 NanoPC T4 中获取 cam(0)?