Mongo查询会话长度

时间:2012-07-16 14:07:36

标签: mongodb mapreduce

在Mongo中我有一个包含两个字段的文档:SessionId和Ticks; SessionId是一个关键字,并且从某个时间点开始,Ticks是一个长整数,用于刻度。

我想做的是通过SessionId对它们进行分组,并获得该会话的最大刻度和最小刻度之间的差异。在SQL中,这将非常简单:

SELECT sessionId, MAX(ticks) - MIN(ticks) as session_length
FROM weblog
GROUP BY sessionId

但是在Mongo中,这似乎是一个相当复杂的MapReduce。 你们会怎么做? MapReduce的? JS for loop?

1 个答案:

答案 0 :(得分:1)

假设我了解您的数据模型,您可以使用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