有一對夫婦的接近這取決於其輸出格式最適合您需要的方法。主要的注意事項是,使用"aggregation framework"本身,您實際上不能返回「投射」日期,但可以在處理API中的結果時獲取易於重構爲對象的值。
第一種方法是使用現有的"Date Aggregation Operators"到聚合框架:
db.collection.aggregate([
{ "$match": {
"time": { "$gte": startDate, "$lt": endDate }
}},
{ "$group": {
"_id": {
"year": { "$year": "$time" },
"dayOfYear": { "$dayOfYear": "$time" },
"hour": { "$hour": "$time" },
"minute": {
"$subtract": [
{ "$minute": "$time" },
{ "$mod": [ { "$minute": "$time" }, 10 ] }
]
}
},
"count": { "$sum": 1 }
}}
])
它返回一個包含所有你想要的「日期」的值_id
複合鍵。或者,如果只是在「小時」內,那麼只需使用「分鐘」部分,並根據您的量程選擇的startDate
計算實際日期。
或者您可以使用普通的「日期數學」來獲得自「時代」以來可以再次被直接饋送到日期構造器的毫秒數。
db.collection.aggregate([
{ "$match": {
"time": { "$gte": startDate, "$lt": endDate }
}},
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$time", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$time", new Date(0) ] },
1000 * 60 * 10
]}
]
},
"count": { "$sum": 1 }
}}
])
在任何情況下,你不想做的事是實際應用$group
之前使用$project
。作爲一個「流水線階段」,$project
必須「循環」所有選定的文件並「轉換」內容。
這需要時間,並且增加了查詢的執行總數。您可以直接申請$group
,如圖所示。因爲JavaScript函數實際上允許重鑄爲日期,但比聚合框架要慢,當然也可以不用,但是,如果你真的「純」了一個Date
對象而沒有後處理,那麼你總是可以使用"mapReduce"。光標響應:
db.collection.mapReduce(
function() {
var date = new Date(
this.time.valueOf()
- (this.time.valueOf() % (1000 * 60 * 10))
);
emit(date,1);
},
function(key,values) {
return Array.sum(values);
},
{ "out": { "inline": 1 } }
)
最好的辦法是使用雖然聚集,作爲改造的響應是很容易的:
db.collection.aggregate([
{ "$match": {
"time": { "$gte": startDate, "$lt": endDate }
}},
{ "$group": {
"_id": {
"year": { "$year": "$time" },
"dayOfYear": { "$dayOfYear": "$time" },
"hour": { "$hour": "$time" },
"minute": {
"$subtract": [
{ "$minute": "$time" },
{ "$mod": [ { "$minute": "$time" }, 10 ] }
]
}
},
"count": { "$sum": 1 }
}}
]).forEach(function(doc) {
doc._id = new Date(doc._id);
printjson(doc);
})
然後你有你的間隔將輸出與真實的Date
對象分組。
['$ mod'](http://docs.mongodb.org/manual/reference/operator/aggregation/mod/)運算符很容易做到這一點。 –