1

在 Mongo 中,我有一个包含两个字段 SessionId 和 Ticks 的文档;SessionId 是一个键,而 Ticks 是从某个时间点开始的长整数。

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

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

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

4

1 回答 1

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

于 2012-07-16T19:32:11.607 回答