2014-10-12 4 views
1

У меня есть следующий запрос MongoDB:

db.collection.aggregate([{ 
    $match : { platform_id : ... } 
}, { 
    $group: { 
     _id: "$type", 
     count: { $sum: 1 } 
    } 
}]); 

Возможные значения для $type являются 0 или 1.

Прямо сейчас, я получаю счет 0 s и 1 s, если есть записи с любым типом значения (0 или 1).

Но если все записи имеют один и тот же тип (например, 1), как я могу получить количество 0 s, равное 0?

От this пост, похоже, что это может быть невозможно. Это правда в этом случае?

ответ

0

Только агрегат не может выполнить вашу цель. После этого вам понадобится JS-код.

var aggr = db.collection.aggregate([{ 
     $match : { platform_id : ... } 
    }, { 
     $group: { 
      _id: {$ifNull : ["$type", 0]}, 
      count: { $sum: 1 } 
     } 
    }]); 

var result = aggr.toArray(); // mongo shell V2.6+ 
// var result = aggr.result; // mongo shell before V2.6 

[{_id : 0, count : 0}, {_id : 1, count : 0}].forEach(function(e) { 
    var i = 0; 
    var len = result.length; 
    while (i < len && e._id != result[i]._id) ++i; 
    if (i >= len) result.push(e); 
}); 
// result is the final.  
+0

Это близко. Предположим, что все документы имеют 'type' установленный' 1' (но '0' является допустимым значением. Как мне его вернуть? [{'Count': 250, '_id': 1}, {'count ': 0,' _id ': 0}] '? – okoboko

+0

@okoboko, Кажется, вы изменили свои требования. Я соответствующим образом обновил ответ. – Wizard

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