У меня есть коллекция с массивом 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 на данный момент.
Почему использование необходимо применять '$ sum' в' a_field' если он не массив? И что означает '_id 'в ожидаемом выходе? – styvane
'_id' на выходе будет одним из значений' an_array' в настоящее время. Это то, что я ожидаю, также, что я получаю список чисел с суммой. Что вы имеете в виду, почему нам нужно применять '$ sum'? Если я хочу постоянно рассчитывать на количество добавлений, это единственный способ, нет? –
На самом деле, вы показали нам 3 документа, и в ожидаемом выводе у вас есть 4.Кроме того, если вы хотите, это отдельный элемент в поле 'an_array' и не равен' a_field', тогда вы делаете это неправильно. Даже если он не отличается, есть лучший способ сделать это. Вы должны подумать над тем, чтобы улучшить свой вопрос. – styvane