2015-05-11 73 views
4

我试图将一组文档和基于它们的值计算它们。 例如mongo组和条件的计数

{ "_id" : 1, "item" : "abc1", "value" : "1" } 
{ "_id" : 2, "item" : "abc1", "value" : "1" } 
{ "_id" : 3, "item" : "abc1", "value" : "11" } 
{ "_id" : 4, "item" : "abc1", "value" : "12" } 
{ "_id" : 5, "item" : "xyz1", "value" : "2" } 

在这里,我想通过“项目”组和得到的回报计的“价值”多少次大于10多少次小。因此:

{ "item": "abc1", "countSmaller": 2, "countBigger": 1} 
{ "item": "xyz1", "countSmaller": 1, "countBigger": 0} 

使用$ aggregate可以轻松实现简单计数,但是如何才能实现上述结果?

回答

6

你需要的是聚合框架的$cond运营商。一种方式得到你想要的是什么:

db.foo.aggregate([ 
    { 
     $project: { 
      item: 1, 
      lessThan10: { // Set to 1 if value < 10 
       $cond: [ { $lt: ["$value", 10 ] }, 1, 0] 
      }, 
      moreThan10: { // Set to 1 if value > 10 
       $cond: [ { $gt: [ "$value", 10 ] }, 1, 0] 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: "$item", 
      countSmaller: { $sum: "$lessThan10" }, 
      countBigger: { $sum: "$moreThan10" } 
     } 
    } 
]) 

注:我假设value为数字而不是字符串。

输出:

{ 
     "result" : [ 
       { 
         "_id" : "xyz1", 
         "countSmaller" : 1, 
         "countBigger" : 0 
       }, 
       { 
         "_id" : "abc1", 
         "countSmaller" : 2, 
         "countBigger" : 2 
       } 
     ], 
     "ok" : 1 
} 
+0

统筹考虑'value'领域是一个字符串,所以你可能要到关键值转换为一个数字。 – chridam

+1

@chridam,感谢您的评论。我在我的答案中添加了一条关于我将'value'字段假设为数字的注释。我将把这部分作为练习向操作系统:) –

+0

我的坏,我没有看到的音符,隐藏在代码之间:P – chridam

2

您需要使用$cond运算符。这里0的值小于101的值大于10。这不完全给你预期的输出。也许有人会发布更好的答案。

db.collection.aggregate(
    [ 
     { 
      "$project": 
       { 
        "item": 1, 
        "value": 
         { 
          "$cond": [ { "$gt": [ "$value", 10 ] }, 1, 0 ] 
         } 
       } 
     }, 
     { 
      "$group": 
       { 
        "_id": { "item": "$item", "value": "$value" },      
        "count": { "$sum": 1 } 
       } 
     }, 
     { 
      "$group": 
       { 
        "_id": "$_id.item", 
        "stat": { "$push": { "value": "$_id.value", "count": "$count" }} 
       } 
      } 
    ] 
) 

输出:

{ 
     "_id" : "abc1", 
     "stat" : [ 
       { 
         "value" : 1, 
         "count" : 2 
       }, 
       { 
         "value" : 0, 
         "count" : 2 
       } 
     ] 
} 
{ "_id" : "xyz1", "stat" : [ { "value" : 0, "count" : 1 } ] } 

你需要你的价值convertintegerfloat