как получить сумму определенного элемента во всех объектах массива с помощью pymongo

#mongodb #pymongo

#mongodb #пимонго

Вопрос:

Ниже приведена моя коллекция

 [{'_id': ObjectId('603e9cc2784fa0d80d8672cd'),
'name': 'balaji',
'items': [{'price': 1, 'price_range': 'A'},
{'price': 6, 'price_range': 'B'},
{'price': 4, 'price_range': 'C'}]}]
 

Итак, в приведенной выше коллекции мы можем видеть только одну запись, и она содержит массив с элементами name, и этот массив содержит объекты с атрибутами price и price_range, могу ли я узнать, как получить сумму всех цен в этом массиве, пожалуйста, я попробовал с помощью приведенного ниже запроса, и это не сработало

 aggregation_string = [{"$match":{"name": "balaji"

            }},{ "$group": {
 

              "_id":  None,
             "count": { "$sum": "$items.price" }
             }}]
db.sample_collection1.aggregate(aggregation_string) 
 

и я получаю значение 0. Может кто-нибудь, пожалуйста, помочь мне здесь.

Ответ №1:

В вашем примере, поскольку вам не нужно группировать объекты, вы можете просто спроецировать сумму таким образом :

 db.collection.aggregate([
  {
    "$match": {
      "name": "balaji"
    }
  },
  {
    "$project": {
      "name": 1,
      "priceTotal": {
        "$sum": "$items.price"
      }
    }
  },
])
 

Это должно работать с MongoDB 3.2, и я думаю, что это лучший способ.

Но если вам абсолютно необходимо использовать $group, вы должны сделать это таким образом:

 db.collection.aggregate([
  {
    "$match": {
      "name": "balaji"
    }
  },
  {
    "$group": {
      "_id": null,
      "count": {
        "$sum": {
          "$sum": "$items.price"
        }
      }
    }
  }
])
 

Это был ваш запрос $ sum, который был неполным.
Или с помощью оператора unwind, чтобы избежать удвоения суммы в $ :

 db.collection.aggregate([
  {
    "$match": {
      "name": "balaji"
    }
  },
  {
    "$unwind": "$items",
  },
  {
    "$group": {
      "_id": null,
      "count": {
        "$sum": "$items.price"
      }
    }
  }
])
 

Комментарии:

1. Спасибо за вашу помощь :), это сработало с помощью вашего запроса проекта.