我正在尝试在mongodb中的日期字段上执行聚合功能,我有兴趣在预定义的日期范围内获取计数结果。
例如:
最近24小时(x)
24 - 48小时(年)
超过48(z)
这甚至可能吗?或者我是否必须执行以排序顺序返回所有文档的查询,然后将它们分成代码中的桶?
谢谢!
答案 0 :(得分:1)
这对于所选日期范围的至少某些限制通常更有意义,但基本原则是使用$cond
运算符返回编码匹配的值的逻辑条件。在这种情况下,它将值传递给$sum
以进行累积:
var now = new Date(),
oneDay = ( 1000 * 60 * 60 * 24 ),
24hours = new Date( now.valueOf() - oneDay ),
48hours = new Date( 24hours.valueOf() - oneDay );
db.collection.aggregate([
{ "$group": {
"_id": null,
"24hours": {
"$sum": {
"$cond": [
{ "$lt": [ 24hours, "$datefield" ] },
1,
0
]
}
},
"48hours": {
"$sum": {
"$cond": [
"$and": [
{ "$gt": [ 24hours, "$datefield" ] },
{ "$lte": [ 48hours, "$datefield" ] }
],
1,
0
]
}
},
"gt48hours": {
"$sum": {
"$cond": [
{ "$gt": [ 48hours, "$datefield" ] },
1,
0
]
}
}
}}
])
这里$cond
采用逻辑表达式来评估它的第一个参数,并返回“{1}}的”第二个“参数或true
的”第三个“参数。基本上是false
或1
取决于条件是否得到满足。
注意这里$gt
的逻辑形式和聚合框架所使用的逻辑形式不同于同一命名的“查询”运算符,因为它们采用两个参数的数组,其中“第一个”参数大于或小于(如所选)“第二”参数。在这种情况下,每个测试值都针对actaul“datefield”,表示要与文档中的字段进行比较。这些符合条件的地方返回0
或不符合条件。
这意味着对于为每个条件选择的范围内定义的日期,计数要么在数据满足条件的情况下累积,要么不是。这就是你如何得到每个时期的不同计数。