#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. Спасибо за вашу помощь :), это сработало с помощью вашего запроса проекта.