Пн goose Заполнение значений и изменение объекта - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь заполнить результаты поиска, используя mon goose. Но я столкнулся с проблемой.

Мои данные - это список продуктов, и каждый продукт содержит список вариантов. Предположим, у меня есть продукт с именем Phone, и у меня есть список вариантов с именами синий, черный и зеленый. То, что я хочу сделать, это вернуть полный список продуктов и сумму запасов.

Пример объекта продукта:

{
 "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 Ответ

2 голосов
/ 19 января 2020

Вы можете использовать конвейер агрегации с оператором $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)

})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...