首页 > 解决方案 > 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
}

标签: javascriptnode.jsmongodbmongoose

解决方案


您可以将聚合管道与$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)

})

推荐阅读