2012-12-12 63 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) { 
     (...) 
}); 

我想通過部門來添加一個可選的過濾器。用戶可以在一個或多個部門,在這裏是如何看起來像DB:

用戶 _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的條件在文檔內部怎麼辦? –