#mongodb
#mongodb
Вопрос:
В приведенном ниже запросе я успешно получаю общую длину всех contribution
массивов, но я пытаюсь также суммировать contribution_receipt_amount
поля из каждого объекта в этих массивах и его текущий результат равен нулю. Что я делаю не так?
doc.aggregate(
[
{ $unwind: '$contributions' },
{
$group: {
_id: candidate.candidate_id,
contributions: { $sum: 1 },
total: { $sum: '$contribution_receipt_amount' }
}
}
],
{ allowDiskUse: true }
)
Документ выглядит следующим образом:
{
"_id" : "2015-05-31",
"contributions" : [
{
"entity_type_desc" : "INDIVIDUAL",
"contribution_receipt_amount" : 109.2,
},
{
"entity_type_desc" : "INDIVIDUAL",
"contribution_receipt_amount" : 105,
}
]
},
{
...
}
И мой вывод выглядит следующим образом:
[ { _id: 'P60008885', contributions: 2, total: 0 } ]
Комментарии:
1. Не знаю. Каков фактический результат?
0
илиnull
? Скорее всего,contribution_receipt_amount
это «строка», а не числовое значение. Покажите выходные данные и документ, в котором, как вы ожидаете, действительно будет отображаться это значение.2. @NeilLunn Я только что отредактировал сообщение с выводом и документом.
Ответ №1:
Загвоздка здесь в том, что поле contribution_receipt_amount
является дочерним для contributions
документа. поэтому вы должны ссылаться на .
обозначения для доступа к элементам вложенного документа.
"contributions" : {
"entity_type_desc" : "INDIVIDUAL",
"contribution_receipt_amount" : 109.2
}
Вот обновленный запрос
doc.aggregate(
[
{ $unwind: '$contributions' },
{
$group: {
_id: candidate.candidate_id,
contributions: { $sum: 1 },
total: { $sum: '$contributions.contribution_receipt_amount' }
}
}
],
{ allowDiskUse: true }
)
Как предложил Neil
doc.aggregate(
[
{
$group: {
_id: candidate.candidate_id,
contributions: { $sum: 1 },
total: { $sum: {$sum: "$contributions.contribution_receipt_amount"} }
}
}
],
{ allowDiskUse: true }
)
Комментарии:
1. Или,
total: { $sum:{ $sum: { '$contributions.contribution_receipt_amount' } }
. Один$sum
для добавления массива и один для «группировки». Вам не нужен$unwind
. ТакжеallowDiskUse: true
это «взлом». Если вы когда-нибудь увидите это сообщение, вы, вероятно, делаете что-то еще неправильно, что должно быть исправлено вместо этого.2. @NeilLunn Я не получил
allowDiskUse: true
часть. Не могли бы вы, пожалуйста, немного подробнее остановиться на этом?3. Не используйте это. Добавьте сортировку или исправьте условия запроса, если вместо этого вы видите сообщение.
4. Очень признателен!