Не удалось извлечь $ sum из MongoDB aggregate

#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. Очень признателен!