我正在尝试使用猫鼬填充查找结果。但是我面临一个问题。

我的数据是产品列表,每个产品都包含一个变体列表。假设我有一个名为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)

})

10-05 21:04
查看更多