Mongo查询会话长度



在Mongo中,我有一个包含两个字段的文档,SessionId和Ticks;SessionId是一个键,Ticks是某个时间点以来Ticks的长int。

我想做的是按SessionId对它们进行分组,并获得该会话的最大Ticks和最小Ticks之间的差异。在SQL中,这将非常容易:

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

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

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

相关内容

  • 没有找到相关文章

最新更新