按日期分组mongoDB
我在mongoDB中有一组数据,我必须按照按日期分组mongoDB,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我在mongoDB中有一组数据,我必须按照$timestamp对这些数据进行汇总。此字段包含日期,但格式为字符串(上面的示例数据) 如何将$timestamp转换为日期,以便将它们组合在一起 接下来,我必须对每个日期和iden的每个分数进行汇总,对每个分数进行汇总 示例数据: [ { _id: "1442", timestamp: "2016-03-15T22:24:02.000Z", iden: "15", scores_
$timestamp
对这些数据进行汇总。此字段包含日期,但格式为字符串(上面的示例数据)
如何将$timestamp
转换为日期,以便将它们组合在一起
接下来,我必须对每个日期和iden的每个分数进行汇总,对每个分数进行汇总
示例数据:
[
{
_id: "1442",
timestamp: "2016-03-15T22:24:02.000Z",
iden: "15",
scores_today: "0.000000",
scores_total: "52337.000000"
}
]
我的代码
var project = {
"$project":{
"_id": 0,
"y": {
"$year": "$timestamp" // tried this way, not working
},
"m": {
"$month": new Date("$timestamp") // tried either this, not working
},
"d": {
"$dayOfMonth": new Date("$timestamp")
},
"iden" : "$iden"
}
},
group = {
"$group": {
"_id": {
"iden" : "$iden",
"year": "$y",
"month": "$m",
"day": "$d"
},
"count" : { "$sum" : "$scores_today" }
}
};
mongoDB.collection('raw').aggregate([ project, group ]).toArray()....
这是node.js服务记录的错误
错误:{[MongoError:异常:无法将BSON类型字符串转换为
日期]名称:“MongoError”,消息:“异常:无法从转换”
BSON类型字符串到日期',errmsg:'异常:无法从转换
BSON类型字符串“截止日期”,代码:16006,确定:0}
您可以使用ISODate($timestamp)
从字符串构造日期对象
更新
如果您没有运行MongoDb shell,那么就不能直接使用ISODate。在这种情况下,请尝试调用eval命令
var aggregationResult=mongoDB.eval(
'
'function() '+
'{ '+
' var project = { '+
' "$project":{ '+
' "_id": 0, '+
' "y": { '+
' "$year": ISODate("$timestamp").getFullYear() '+
' }, '+
' "m": { '+
' "$month": ISODate("$timestamp").getMonth()+1 // months start from 0 '+
' }, '+
' "d": { '+
' "$dayOfMonth": ISODate("$timestamp").getDate() '+
' }, '+
' "iden" : "$iden" '+
' } '+
' }, '+
' group = { '+
' "$group": { '+
' "_id": { '+
' "iden" : "$iden", '+
' "year": "$y", '+
' "month": "$m", '+
' "day": "$d" '+
' }, '+
' "count" : { "$sum" : "$scores_today" } '+
' } '+
' };
' var result=db.raw.aggregate([ project, group ]); '+
' return result; '+
' } '+
'
);
它告诉我这个ReferenceError:ISODate未定义
@a.ndrea,如果您只在mongo CLI中键入ISODate()代码>您将看到什么结果?@a.ndrea好的,请尝试将“$timestamp”放在引号中。我无法访问mongo CLI,它不在我的电脑上,我无法访问它。甚至尝试了“$timestamp”,仍然是相同的错误,ISODate未定义OK,您使用的是什么客户端?如果它不是mongo CLI,则不能按原样在代码中使用它的函数,必须将它们传递给mongo,以便在聚合运行时调用它们。我想,您只需要在eval()中传递所有聚合脚本就可以做到这一点。
var aggregationResult=mongoDB.eval(
'
'function() '+
'{ '+
' var project = { '+
' "$project":{ '+
' "_id": 0, '+
' "y": { '+
' "$year": ISODate("$timestamp").getFullYear() '+
' }, '+
' "m": { '+
' "$month": ISODate("$timestamp").getMonth()+1 // months start from 0 '+
' }, '+
' "d": { '+
' "$dayOfMonth": ISODate("$timestamp").getDate() '+
' }, '+
' "iden" : "$iden" '+
' } '+
' }, '+
' group = { '+
' "$group": { '+
' "_id": { '+
' "iden" : "$iden", '+
' "year": "$y", '+
' "month": "$m", '+
' "day": "$d" '+
' }, '+
' "count" : { "$sum" : "$scores_today" } '+
' } '+
' };
' var result=db.raw.aggregate([ project, group ]); '+
' return result; '+
' } '+
'
);