2016-08-12 3 views
2

У меня есть коллекция с массивом an_array и поле a_field. Массив может состоять из значений (массив может быть пустым), который также может существовать в a_field.Сумма поля и массива в агрегате MongoDB

Я хочу создать агрегатную функцию, которая суммирует количество значений в a_field или an_array.

Редактировать: напр. Я хочу подсчитать, сколько раз 1 используется в a_field и an_array и т. Д.

Например, если у меня есть какие-то документы, выглядит следующим образом:

{ 
    a_field: 1, 
    an_array: [ 1, 3, 4 ], 
}, 
{ 
    a_field: 3, 
    an_array: [], 
} 
{ 
    a_field: 2, 
    an_array: [ 1 ], 
} 

Я хотел бы видеть выход так:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 2, a_count: 1, b_count: 0 }, { _id: 3, a_count: 1, b_count: 1 }, { _id: 4, a_count: 0, b_count: 1 } ] 

Однако я получаю такой вывод:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 3, a_count: 1, b_count: 1 }, { _id:4, a_count: 1, b_count: 1 } ] 

что неверно, так как он отсутствует _id 2, и _id 4 слишком много.

Проблема, с которой я столкнулся, заключается в том, что когда an_array пуст, я не буду возвращать все счета должным образом, если массив пуст, плюс он получает значение a_count, которое не всегда совпадает с фактическим идентификатором (как можно видеть в _id 4).

То, что я до сих пор это:

db.getCollection('test').aggregate([ 
    { $match: { 
     a_field: { 
      $ne: null 
     } 
    } }, 

    { $group: { 
     _id: '$a_field', 
     a_count: { 
      $sum: 1 
     }, 
     an_array: { 
      $push: { 
       an_array: '$an_array' 
      } 
     } 
    } }, 

    { $project: { 
     an_array: 1, 
     a_count: 1 
    } }, 

    { $unwind: '$an_array' }, 
    { $unwind: '$an_array.an_array' }, 

    { $group: { 
     _id: '$an_array.an_array', 
     b_count: { 
      $sum: 1 
     }, 
     a_count: { 
      $first: '$a_count' 
     } 
    } }, 
]); 

Я был бы очень признателен некоторые материалы, как я хотел бы сделать это в одном агрегате. На данный момент это стало скорее личным поиском, чем реальной реализацией. Благодаря!

Редактировать: Я привязан к MongoDB 2.6 на данный момент.

+0

Почему использование необходимо применять '$ sum' в' a_field' если он не массив? И что означает '_id 'в ожидаемом выходе? – styvane

+0

'_id' на выходе будет одним из значений' an_array' в настоящее время. Это то, что я ожидаю, также, что я получаю список чисел с суммой. Что вы имеете в виду, почему нам нужно применять '$ sum'? Если я хочу постоянно рассчитывать на количество добавлений, это единственный способ, нет? –

+0

На самом деле, вы показали нам 3 документа, и в ожидаемом выводе у вас есть 4.Кроме того, если вы хотите, это отдельный элемент в поле 'an_array' и не равен' a_field', тогда вы делаете это неправильно. Даже если он не отличается, есть лучший способ сделать это. Вы должны подумать над тем, чтобы улучшить свой вопрос. – styvane

ответ

1

Используйте поле $size для поля массива, которое является новым для v2.6, вам повезло!

Кроме того, я не понимаю, почему вы хотите, чтобы попытаться подсчитать $a_field - там всегда будет один элемент, поскольку это не является массивом - так это объединение включает в себя только то, что $a_field является как _id в результате. Вы знаете, что счет для $a_field всегда будет 1, как это не массив:

db.test.aggregate([{ 
    $match: { 
    a_field: { 
     $ne: null 
    } 
    } 
}, { 
$group: { 
    _id: '$a_field', 
    an_array_size: { 
     $size: '$an_array' 
    } 
    } 
}]) 

Пример консольного вывода:

> db.test.find({}); 
{ 
    "_id": ObjectId("57ada868700ca97222421d8b"), 
    "a_field": 1, 
    "an_array": [1, 3, 4] 
} 

> db.test.aggregate([{ 
    $match: { 
    a_field: { 
     $ne: null 
    } 
    } 
}, { 
$group: { 
    _id: '$a_field', 
    an_array_size: { 
     $size: '$an_array' 
    } 
    } 
}]) 
{ 
    "result": [{ 
    "_id": 1, 
    "an_array_size": 3 
    }], 
    "ok": 1 
} 
+0

Мне нравятся ваши комментарии, но это не то, о чем я прошу. Если это неясно, то извините, и я пересмотрю свой вопрос. Причина, по которой я '$ sum', заключается в том, что я хочу знать, как _many_ times' 1', '2 и т. Д. Используются в' a_field' и 'an_array'. Это более ясно? –

+0

Посмотрите, что я дал в качестве примера вывода. –

+0

Ах намного понятнее! Я обновлю ответ, я не видел пример _id :, 4. –

Смежные вопросы