MongoDB: подсчет количества элементов в массиве
У меня есть коллекция, в которой каждый документ в коллекции имеет массив с именем foo
, который содержит набор встроенных документов. Существует ли в оболочке MongoDB тривиальный способ подсчета количества экземпляров внутри foo
? что-то вроде:
db.mycollection.foos.count()
или db.mycollection.foos.size()
?
Каждый документ в массиве должен иметь уникальный foo_id
, и я хочу сделать быстрый подсчет, чтобы убедиться, что правильное количество элементов находится внутри массива для случайного документа в коллекции.
Ответы
Ответ 1
В 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 }
Ответ 2
если вы находитесь в последней версии mongo (2.2 и более поздней версии), вы можете использовать структуру агрегации.
db.mycollection.aggregate([
{$unwind: '$foo'},
{$group: {_id: '$_id', 'sum': { $sum: 1}}},
{$group: {_id: null, total_sum: {'$sum': '$sum'}}}
])
который даст вам общую сумму foo
вашей коллекции.
Опускание последнего group
будет агрегировать результаты на запись.
Ответ 3
Вы можете попробовать подсчитать элементы в foos.
db.collection.aggregate([{$project: {numberOfFoos: { $size: "$foos" } } } ] )