猫鼬填充值并修改对象

时间:2020-01-18 21:13:28

标签: javascript node.js mongodb 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
}

1 个答案:

答案 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)

})