mongodb聚合转换为int
问题描述:
我有使用聚合框架mongo的下列问题。 假设和项目的时间以秒,t和一个事件id发生,如: 项目:{t:11433,e:some_id}mongodb聚合转换为int
我想要的是根据t和e聚合。这意味着在时间t内统计id'e'的数量。 使用$ group进行聚合很容易。
但是,我想有一个不同的时间过程。例如,我想在例如一个时间段中统计相同事件ID的数量。 5秒。我可以用js或python编程。我只是想知道是否可以使用mongo,使用群组级联。
我尝试使用$ divide [t,10]进行投影。对于11433,这会给出,1143.3但是,我似乎无法删除Mongo中的0.3(否则我可以在这个其他范围内组合)。
任何提示?
感谢
答
要获得一个5秒的时间间隔的整组密钥,您可以使用公式
t = t - (t % 5) // % is the modula operator
在聚合框架,这将是这样的:
db.xx.aggregate([
// you need two projections, as they can not be nested
// this does not work:
// { $project: { _id: 0, e: 1, t: 1, tk: { $subtract: [ "$t", $mod: [ "$t", 5 ] ] } } },
//
// get modula 5 of time in seconds:
{ $project: { _id: 0, e: 1, t: 1, tm5: { $mod: [ "$t", 5 ] } } },
// subtract it from time:
{ $project: { _id: 0, e: 1, ti: { $subtract: [ "$t", "$tm5" ] } } },
// now group on e and interval,
{ $group: { _id: { e: "$e", interval: "$ti" }, count: { $sum: 1 } } },
])
对于此示例集合:
> db.xx.find()
{ "_id" : ObjectId("515e5a7157a0887a97cc8d1d"), "t" : 11433, "e" : "some_id" }
{ "_id" : ObjectId("515e60d457a0887a97cc8d1e"), "t" : 11434, "e" : "some_id" }
{ "_id" : ObjectId("515e60d857a0887a97cc8d1f"), "t" : 11438, "e" : "some_id" }
结果是:
{
"result" : [
{
"_id" : {
"e" : "some_id",
"interval" : 11435
},
"count" : 1
},
{
"_id" : {
"e" : "some_id",
"interval" : 11430
},
"count" : 2
}
],
"ok" : 1
}
据我所知,没有聚合。 – 2013-03-16 00:03:09