我有这样的集合列表:
{'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分组。
答案 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 ] }
}
}
}
]
)
我希望它会有所帮助!