Пн goose - поиск элемента в массиве поддокументов вместе со всей суммой в этом массиве - PullRequest
0 голосов
/ 28 мая 2020

У меня есть коллекция Shop с таким документом:

{
  _id:'xyz'
  sales:[
    {
      _id:'aaa'
      productId:'ppp',
      quantity: 3
    },
    {
     _id:'bbb'
     productId:'qqq'
     quantity: 4
   },
  ]
}

Когда я запрашиваю элемент в массиве продаж (_id: 'aaa'), мне нужно получить его количество и сумму количества в весь массив продаж ie количество: 3, totalQuantity: 7

То же самое, когда я запрашиваю другой элемент (_id: 'bbb'), мне нужно получить количество: 4, totalQuantity: 7

Я пробовал использовать агрегат следующим образом:

Shop.aggregate([
        {$match: {'_id': ObjectId('xyz'),'sales._id':ObjectId('aaa')}},
        {$group: {
          _id: "$_id",
          totalQuantity: {
            "$sum": {
              "$sum": "$sales.quantity"
            }
          }
        }
 ])

Но это не работает.

Как я могу этого добиться?

1 Ответ

1 голос
/ 28 мая 2020

Мы можем получить totalQuantity, используя $ sum .

Мы можем использовать $ filter , чтобы найти требуемый элемент и получить доступ к количеству.

Площадка

db.collection.aggregate([
  {
    $match: {
      _id: "xyz"
    }
  },
  {
    $project: {
      totalQuantity: {
        $sum: "$sales.quantity"
      },
      quantity: {
        $filter: {
          input: "$sales",
          cond: {
            $eq: [
              "$$this._id",
              "aaa"
            ]
          }
        }
      }
    }
  },
  {
    $addFields: {
      quantity: {
        $sum: "$quantity.quantity"
      }
    }
  }
])

Это даст следующий результат для значения «aaa»:

[
  {
    "_id": "xyz",
    "quantity": 3,
    "totalQuantity": 7
  }
]

А для ненайденного значения количество будет быть 0:

[
  {
    "_id": "xyz",
    "quantity": 0,
    "totalQuantity": 7
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...