2014-01-27 3 views
13

У меня есть коллекция, в которой каждый документ в коллекции имеет массив с именем foo, который содержит набор встроенных документов. Существует ли в оболочке MongoDB тривиальный способ подсчета количества экземпляров в пределах foo? что-то вроде:MongoDB: подсчитать количество элементов в массиве

db.mycollection.foos.count() или db.mycollection.foos.size()?

Для каждого документа в массиве должен быть уникальный foo_id, и я хочу сделать быстрый подсчет, чтобы убедиться, что количество элементов в массиве находится в массиве для случайного документа в коллекции.

ответ

13

Если вы находитесь в последней версии монго (2.2 и более поздней), вы можете использовать структуру агрегации.

db.mycollection.aggregate([ 
    {$unwind: '$foo'}, 
    {$group: {_id: '$_id', 'sum': { $sum: 1}}}, 
    {$group: {_id: null, total_sum: {'$sum': '$sum'}}} 
]) 

, который даст вам общую сумму foo s вашей коллекции.

Опуская последние group, агрегирует результаты на запись.

+0

Удивительный, помог мне также. Можете ли вы предложить, как я могу получить доступ к «total_sum» в дальнейших расчетах? –

29

В MongoDB 2.6, Aggregation Framework имеет новый оператор массив $size вы можете использовать:

> db.mycollection.insert({'foo':[1,2,3,4]}) 
> db.mycollection.insert({'foo':[5,6,7]}) 

> db.mycollection.aggregate({$project: { count: { $size:"$foo" }}}) 
{ "_id" : ObjectId("5314b5c360477752b449eedf"), "count" : 4 } 
{ "_id" : ObjectId("5314b5c860477752b449eee0"), "count" : 3 } 
+0

Есть ли способ, которым мы можем получить 7 (4 + 3) в этом случае? – xxbidiao

+0

@xxbidiao Конечно, просто используйте этап '$ group', который суммирует размеры массива:' db.mycollection.aggregate ({$ group: {_id: null, totalSize: {$ sum: {$ size: "$ foo" }}}}) '. – Stennie

-1

Вы можете попробовать сосчитать элементы в Фоосе.

db.collection.aggregate([{$project: {numberOfFoos: { $size: "$foos" } } } ]) 
+1

Как это отличается от [другого существующего ответа] (https://stackoverflow.com/a/22152786/2313887)? Похож на рыбалку за репутацию. –

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