2017-02-02 3 views
0

мне нужен запрос, как это:Mongoose - как группы по двум различным пунктам

db.items.aggregate([ 
{ 
    $group: { 
     _id: '$dataset_id', 
     labeledCount: {WHERE labels.length>0}, // this line is problem 
     totalCount: {$sum: 1} 
    } 
}]) 

объект Item выглядит следующим образом:

{ 
_id: 1, 
labels: [...] 
... 
} 

результат должен выглядеть следующим образом:

{_id: 1, labeledCount: 4, totalCount: 5}, 
{_id: 2, labeledCount: 0, totalCount: 4}, 
... 

EDIT:
Это clo сьесть я получил:

db.items.aggregate(
    [ 
     { 
      $group : { 
       _id : "$dataset_id", 
       "labeled" : { 
        $sum : { 
         $cond : { if: { "$labels.0": { "$exists": true } }, then: 1, else: 0} 
        } 
       }, 
       "total" : { $sum : 1 } 
      } 
     } 
    ] 
) 

Сейчас я получаю сообщение об ошибке:

"exception: dotted field names are only allowed at the top level",

ответ

0

Вот ответ:

db.items.aggregate(
    [ 
     { 
      $group : { 
       _id : "$dataset_id", 
       "labeled" : { 
        $sum : { 
         $cond : { if: { $ne: [0, { $size: "$labels" }]}, then: 1, else: 0} 
        } 
       }, 
       "total" : { $sum : 1 } 
      } 
     } 
    ] 
) 

Объяснение:
{ $size: "$labels" } возвращает количество элементов в labels массиве.
$ne: [0, { $size: "$labels" }] проверяет labels имеет 0 элементов



EDIT:
Я только развертывается это на сервер и он выдает следующее сообщение об ошибке:

exception: the $cond operator requires an array of 3 operands

Но локально он работает. Постараюсь проверить, выпущена ли версия mongo, иначе я не уверен, что может быть проблемой.

+0

Это будет работать с версиями mongodb версии 2.6 и выше –

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