2012-07-16 59 views
1

在Mongo中,我有一个带有两个字段SessionId和Ticks的文档; SessionId是一个关键,并且Ticks从某个时间点开始是tick的一个长整型。Mongo查询会话长度

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

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

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

回答

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

+1

在中号ongoDB版本2.2(下一个稳定版本),新的聚合框架将使得可以在没有Javascript的情况下进行这种类型的聚合。此外,如果您可能希望使用sessionID存储最小值和最大值,以最大限度提高查询性能。以下是新聚合框架的链接:http://docs.mongodb.org/manual/applications/aggregation/ – Jenna 2012-07-16 19:36:19