2017-01-30 7 views
1

Если у меня есть данные следует:Группы по количеству для булевых значений в коллекции

[{ 
    flagOne: true, 
    flagTwo: true 
}, 
{ 
    flagOne: true, 
    flagTwo: false 
}, 
{ 
    flagOne: true, 
    flagTwo: false 
}, 
{ 
    flagOne: true, 
    flagTwo: true, 
    flagThree: true 
}] 

Обратите внимание, что флаг не может быть установлен, и должен рассматриваться как ложные.

Как получить что-то вроде этого результата агрегации?

{ 
    flagOne: 4, 
    flagTwo: 2, 
    flagThree: 1 
} 

В принципе, я хотел бы знать # документов в моей коллекции, сгруппированных по каждому из логических флагов.

ответ

3

Не имеет значения, существует ли flagThree, или он равен "tomato". Просто посчитайте флаги, только если они имеют значение true:

db.getCollection('so').aggregate([ 
    { 
     $group: { 
      _id : 1, 
      flagOne: {$sum: {$cond: [{$eq:["$flagOne", true]}, 1, 0]}}, 
      flagTwo: {$sum: {$cond: [{$eq:["$flagTwo", true]}, 1, 0]}}, 
      flagThree: {$sum: {$cond: [{$eq:["$flagThree", true]}, 1, 0]}}, 
     } 
    }, 
    {$project: {_id:0}} 
]) 

Выход:

{ 
    "flagOne" : 4, 
    "flagTwo" : 2, 
    "flagThree" : 1 
} 

Если вы полностью уверены, что все флаги могут иметь только булевы значения, можно упростить запрос к

db.getCollection('so').aggregate([ 
    { 
     $group: { 
      _id : 1, 
      flagOne: {$sum: {$cond: ["$flagOne", 1, 0]}}, 
      flagTwo: {$sum: {$cond: ["$flagTwo", 1, 0]}}, 
      flagThree: {$sum: {$cond: ["$flagThree", 1, 0]}}, 
     } 
    }, 
    {$project: {_id:0}} 
]) 
+1

Спасибо, это сработало отлично. Мне просто нужно было обновить '$ project', чтобы включить' {flagOne: 1, flagTwo: 1, flagThree: 1} 'вместо просто' {_id: 0} ' – purplecones