使用计算值进行聚合比较

时间:2017-06-07 10:06:42

标签: node.js mongodb aggregation-framework

var data_form = {
  {
    _id : "123",
    result:{
      run:10
    },
    result_re:{
      run:10
    },
    result_ch:{
      run:10
    },
    result_qm:{
      run:10
    }
  },
  {
    _id : "345",
    result:{
      run:20
    },
    result_re:{
      run:20
    },
    result_ch:{
      run:20
    },
    result_qm:{
      run:20
    }
  },
  {
    _id : "567",
    result:{
      run:30
    },
    result_re:{
      run:30
    },
    result_ch:{
      run:30
    },
    result_qm:{
      run:30
    }
  }
}

var pipeline = [
      { $project: { 

          total: { $add: [ "$result.run", "$result_re.run", "$result_ch.run", "$result_qm.run"] } ,               
          discount:{  
                      $cond: [ { $gt: [ total , 50 ] }, 1, 0]
                   }
          }
      },
      { $sort: {total: -1}},
      { $limit : 10 }
]

db.getCollection('game_users').aggregate(pipeline)

我需要将总输出与聚合条件进行比较,如果条件匹配则需要计数器增加。

我的收藏是在data_form变量中定义的。

总计字段输出来自查询,如果该计数器增加后该总数大于50。

1 个答案:

答案 0 :(得分:1)

您需要在$cond中指定表达式。您无法在同一管道阶段中引用另一个计算字段的值。要么两次,要么分开。同一阶段效率最高:

var pipeline = [
  { $project: { 
     total: { 
         $add: [ 
           "$result.run",
          "$result_re.run",
          "$result_ch.run",
          "$result_qm.run"
         ]
     } ,               
     discount:{  
       $cond: [
         { $gt: [ 
           { $add: [ 
             "$result.run",
             "$result_re.run",
             "$result_ch.run",
             "$result_qm.run"
           ]},
           50
         ]},
         1,
         0
       ]
     }
  }},
  { $sort: {total: -1}},
  { $limit : 10 }
]

或将$project分为两个阶段

var pipeline = [
  { $project: { 
     total: { 
         $add: [ 
           "$result.run",
          "$result_re.run",
          "$result_ch.run",
          "$result_qm.run"
         ]
     }
  }},
  { $project: {
     total: 1,
     discount:{  
       $cond: [
         { $gt: [ "$total", 50 ] }
         1,
         0
       ]
     }
  }},

  }}
  { $sort: {total: -1}},
  { $limit : 10 }
]

这看起来“更漂亮”但是运行另一个阶段意味着另一个传递数据,所以最好在一个阶段完成。

要获得整个集合的“总计”,请对分页结果运行单独的聚合。

var pipeline = [
  { $group: { 
     _id: null,
     total: {
       $sum: {
         $add: [ 
           "$result.run",
           "$result_re.run",
           "$result_ch.run",
           "$result_qm.run"
         ]
       }
     } ,               
     discount:{
       $sum: {
         $cond: [
           { $gt: [ 
             { $add: [ 
               "$result.run",
               "$result_re.run",
               "$result_ch.run",
               "$result_qm.run"
             ]},
             50
           ]},
           1,
           0
         ]
       }
     }
  }}
];

不要尝试同时获取分页结果和总数,因为这不是你的工作方式。这些应该单独运行,因为尝试返回一个结果肯定会破坏实际用例中的BSON限制。