我如何计算mongoDB中的聚合

时间:2017-11-08 09:57:36

标签: mongodb aggregation

我有这样的集合列表:

{'ids' : 1, name : 'john', value: true, shrotDate : '1000'}
{'ids' : 1, name : 'bob', value: true, shrotDate : '1001'}
{'ids' : 1, name : 'bob', value: false, shrotDate : '1001'}
{'ids' : 1, name : 'bob', value: true, shrotDate : '1003'}
{'ids' : 1, name : 'john', value: true, shrotDate : '1004'}
{'ids' : 1, name : 'john', value: false, shrotDate : '1004'}
{'ids' : 1, name : 'john', value: true, shrotDate : '1004'}
{'ids' : 1, name : 'john', value: false, shrotDate : '1005'}
{'ids' : 1, name : 'john', value: true, shrotDate : '1006'}**strong text**

我想聚合所以,每个用户都会有一个计数器来计算真实的值的数量,但每天只计算一次,这意味着如果我有一个用户的vlue = true两次,但是同一天,它只算1。 例如:

{'ids' : 1, name : 'john', value: true, shrotDate : '1004'}
{'ids' : 1, name : 'john', value: false, shrotDate : '1004'}
{'ids' : 1, name : 'john', value: true, shrotDate : '1004'}

只会在计数器上添加1,因为它是同一天。

这就是我所拥有的,但它每天都要多次。

db.aggregate([
    {"$group" : {_id:"$name", count:{$sum:1}}},
    ("$match" : {"value" : true}
])

所以在聚合之后我会有一个这样的列表:

    {
   "user" : john,
   "count" : 3
    },
    {
   "user" : bob,
   "count" : 2
    },

感谢。

答案!

所以我为自己的问题提供了答案。

db.getCollection().aggregate(
[
    {$match: {"value": "true"}},
    {$group: {_id: {u: "$name", d: "$shortDate"}, count: {$sum: 1}}},
    {$group: {_id: "$_id.u", c: {$sum: 1}}},
    {$sort: {c: -1}},
]
)

我所做的是首先查找值为true的所有日期,然后再按ID分组。

1 个答案:

答案 0 :(得分:0)

我没有确切的答案,但我可以帮助一点。

您可以使用此处记录的$sum累加器聚合运算符:https://docs.mongodb.com/manual/reference/operator/aggregation/sum/

此外还有$cond条件聚合运算符:https://docs.mongodb.com/manual/reference/operator/aggregation/cond/

$group阶段,添加count属性{ $sum: 1 },这意味着您为群组中的每个用户增加一个。

现在您只想在验证条件时增加,您可以在此处使用$cond。根据文档:{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }所以它将是{ $cond: [ <boolean-expression>, 1, 0 ] }

示例(根据您的收藏集名称为users,您可能需要更改模型):

db.users.aggregate(
   [
     {
       $group:
         {
           _id: $name,
           count: {
               $sum: { "$cond": [ <boolean-expression>,  1, 0 ] }
           }
         }
     }
   ]
)

我希望它会有所帮助!