3 回答

TA貢獻1998條經驗 獲得超6個贊
使用Mongo聚合框架的新答案
在詢問并回答了這個問題之后,10gen發布了具有聚合框架的Mongodb 2.2版,這是現在進行此類查詢的更好方法。該查詢有些挑戰,因為您要按日期分組,并且存儲的值是時間戳,因此您必須執行一些操作以將時間戳轉換為匹配的日期。出于示例目的,我將只編寫一個獲得正確計數的查詢。
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
這將返回類似:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
您需要使用$match來限制查詢到您感興趣的日期范圍,然后$project重命名_id為date。讀者如何練習如何將一年中的日期轉換回日期。:-)
10gen有一個方便的SQL到Mongo聚合轉換圖表,值得收藏。還有一篇有關日期聚合運算符的文章。
有點兒幻想,您可以使用:
db.col.aggregate([
{ $group: {
_id: {
$add: [
{ $dayOfYear: "$date"},
{ $multiply:
[400, {$year: "$date"}]
}
]},
click: { $sum: 1 },
first: {$min: "$date"}
}
},
{ $sort: {_id: -1} },
{ $limit: 15 },
{ $project: { date: "$first", click: 1, _id: 0} }
])
它將為您提供最近的15天,并在該date字段的每一天之內返回一些日期時間。例如:
[
{
"click" : 431,
"date" : ISODate("2013-05-11T02:33:45.526Z")
},
{
"click" : 702,
"date" : ISODate("2013-05-08T02:11:00.503Z")
},
...
{
"click" : 814,
"date" : ISODate("2013-04-25T00:41:45.046Z")
}
]

TA貢獻1783條經驗 獲得超4個贊
這可以幫助
return new Promise(function(resolve, reject) {
db.doc.aggregate(
[
{ $match: {} },
{ $group: { _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
]
).then(doc => {
/* if you need a date object */
doc.forEach(function(value, index) {
doc[index]._id = new Date(value._id);
}, this);
resolve(doc);
}).catch(reject);
}
- 3 回答
- 0 關注
- 1793 瀏覽
添加回答
舉報