Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose填充值并修改对象_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose填充值并修改对象

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

我正在尝试使用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)

})

您可以使用带有
$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)

})

我必须在你的代码中做一些更改,但它正是我想要的方式,非常感谢。我必须在你的代码中做一些更改,但它正是我想要的方式,非常感谢