1

Mongo には、SessionId と Ticks の 2 つのフィールドを持つドキュメントがあります。SessionId はキーで、Ticks はある時点からのティックの long int です。

私がやりたいのは、それらを SessionId でグループ化し、そのセッションの最大ティックと最小ティックの差を取得することです。SQL では、かなり簡単です。

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

しかし、Mongo では、これはかなり複雑な 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 に答える