使用计算值进行汇总比较

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_formvariables中定义的。

总的字段输出从查询中得到,如果在计数器增加之后总数大于50。

您需要在$cond指定expression式。 您不能在同一pipe道阶段中引用另一个计算字段的值。 要么做两次,要么分开放置。 同一个阶段是最有效率的:

 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限制。