2012-12-12 5 views
3

Я пытаюсь выяснить, есть ли способ закодировать условное выражение в структуре агрегации MongoDB.Условный отдых в агрегации MongoDb?

У меня есть команда агрегации, как это:

models.Users.aggregate(
     { // SELECT 
     $project : { "sex" : 1, 
       "salesIndex":1 
       } 
     }, 
     { // WHERE 
      $match: {"salesIndex": {$gte: index}} 
     },    
     { // GROUP BY y agregadores 
      $group: { 
       _id  : "$sex", 
       sexCount : { $sum: 1 } 
      } 
     }, 
     { $sort: { sexCount: -1 } } 
, function(err, dbres) { 
     (...) 
}); 

Я хотел бы добавить дополнительный фильтр по отделам. Пользователь может находиться в одном или нескольких отделов, вот как это выглядит в БД:

пользователя _id секс salesIndex отделов {[d1, d2, d3]}

Если бы я хотел поиск пользователей в определенном отделе, я бы закодировал предложение $ unwind, а затем $ match по отделу. Однако я хотел бы использовать ту же команду агрегации для обоих сценариев, что-то вроде этого:

models.Users.aggregate(
     { // SELECT 
     $project : { "sex" : 1, 
       "salesIndex":1 
       } 
     }, 
     { // WHERE 
      $match: {"salesIndex": {$gte: index}} 
     }, 

        IF (filteringByDepartment){ 

         $unwind departments here        
         $match by departmentId here 
        } 

     { // GROUP BY y agregadores 
      $group: { 
       _id  : "$sex", 
       sexCount : { $sum: 1 } 
      } 
     }, 
     { $sort: { sexCount: -1 } } 
, function(err, dbres) { 
     (...) 
}); 

Возможно ли это вообще, или мне нужно 2 команды агрегации?

ответ

6

Создайте свой агрегацию трубопровод программно до вызова aggregate:

var pipeline = []; 
pipeline.push(
    { // SELECT 
    $project : { "sex" : 1, 
      "salesIndex":1 
      } 
    }, 
    { // WHERE 
     $match: {"salesIndex": {$gte: index}} 
    } 
); 
if (filteringByDepartment) { 
    pipeline.push(
     { $unwind: '$departments' }, 
     { $match: { departments: departmentId }} 
    ); 
}  
pipeline.push(
    { // GROUP BY y agregadores 
     $group: { 
      _id  : "$sex", 
      sexCount : { $sum: 1 } 
     } 
    }, 
    { $sort: { sexCount: -1 } } 
); 

models.Users.aggregate(pipeline, function(err, dbres) { 
    //... 
}); 
+0

Это звучит, как заставка, не знаю, что вы могли бы сделать это так. Спасибо! –

+0

Что делать, если условие if находится внутри документа? –