假设我理解你的数据模型,你可以使用group命令:
db.coll.group({
key:{session:true},
initial: {max: 0, min:100},
reduce: function(obj, prev){
if(obj.ticks > prev.max){
prev.max=obj.ticks;
}
if(obj.ticks <prev.min){
prev.min=obj.min;
}
},
finalize: function(out){
out.session_length=out.max - out.min;
}
})
例如输入:
{ "_id" : 1, "session" : 1, "ticks" : 10 }
{ "_id" : 2, "session" : 1, "ticks" : 4 }
{ "_id" : 3, "session" : 1, "ticks" : 12 }
{ "_id" : 4, "session" : 2, "ticks" : 6 }
{ "_id" : 5, "session" : 2, "ticks" : 8 }
{ "_id" : 6, "session" : 2, "ticks" : 3 }
输出示例:
[
{
"session" : 1,
"max" : 12,
"min" : 4,
"session_length" : 8
},
{
"session" : 2,
"max" : 8,
"min" : 3,
"session_length" : 5
}
]
http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group
在中号ongoDB版本2.2(下一个稳定版本),新的聚合框架将使得可以在没有Javascript的情况下进行这种类型的聚合。此外,如果您可能希望使用sessionID存储最小值和最大值,以最大限度提高查询性能。以下是新聚合框架的链接:http://docs.mongodb.org/manual/applications/aggregation/ – Jenna 2012-07-16 19:36:19