2016-06-09 4 views
1

К примеру, у меня есть коллекции, как это:Как получить количество массива сразу?

{"_id": 1, "type": 'A', "data": "asdff"}, 
{"_id": 2, "type": 'B', "data": "fsdfs"}, 
{"_id": 3, "type": 'A', "data": "aesdf"}, 
{"_id": 4, "type": 'C', "data": "sdsdd"}, 

я могу получить счет Тип А в:

db.colA.find({type: 'A'}).count() 

Как я могу получить массив типа, например, A, B, C посчитаем

db.colA.find({type: {$in: ['A', 'B', 'C']}}).countByType() ?? 

Должен ли я сделать петлю как db.colA.find({type: type}).count()?

ответ

1

Для этого вам необходимо использовать структуру агрегации. Вам просто нужно указать $group свои документы по типу и использовать оператор аккумулятора $sum, чтобы вернуть «счет» для каждого «типа».

db.colA.aggregate(
    [ 
     { "$match": { "type": { "$in": [ "A", "B", "C" ] } }, 
     { "$group": { 
      "_id": "$type", 
      "count": { "$sum": 1 } 
     }} 
    ] 
) 

Конечно, вы всегда можете получить общее количество для "A", "B", "C", используя count() метод:

db.colA.count({ "type": { "$in": [ "A", "B", "C" ] } }) 
1

Это работает для меня:

db.getCollection('Mytest').aggregate([{ 
      $group: 
      {_id: {"type":"$type"},"count": { $sum: 1 }}}]) 

Выход:

{ 
    "_id" : { 
     "type" : "C" 
    }, 
    "count" : 1 
} 


{ 
    "_id" : { 
     "type" : "B" 
    }, 
    "count" : 1 
} 


{ 
    "_id" : { 
     "type" : "A" 
    }, 
    "count" : 2 
} 
Смежные вопросы