2016-11-27 9 views
1

何らかのイベントを表す大量のドキュメントがあります。コレクションには、異なるuserIdのイベントが含まれています。集計中にイベントをカウントして文字列リテラルを挿入します

{ 
    "_id" : ObjectId("57fd7d00e4b011cafdb90d22"), 
    "userId" : "123123123", 
    "userType" : "mobile", 
    "event_type" : "clicked_ok", 
    "country" : "US", 
    "timestamp" : ISODate("2016-10-12T00:00:00.308Z") 
} 
{ 
    "_id" : ObjectId("57fd7d00e4b011cafdb90d22"), 
    "userId" : "123123123", 
    "userType" : "mobile", 
    "event_type" : "clicked_cancel", 
    "country" : "US", 
    "timestamp" : ISODate("2016-10-12T00:00:00.308Z") 
} 

深夜に私は前日のすべてのドキュメントの集計を実行する必要があります。私は特定のuserIdのための異なるイベントの数を得ることができるように、ドキュメントを集める必要があります。

私は二つのことを実行する必要が集約中に
{ 
    "userId" : "123123123", 
    "userType" : "mobile", 
    "country" : "US", 
    "clicked_ok" : 23, 
    "send_message" : 14, 
    "clicked_cancel" : 100, 
    "date" : "2016-11-24", 
} 

  1. 特定のuserIdのイベントの日付

  • アドオン「日付」のテキストフィールドすべてのヘルプの計算数が大幅にあり感謝! :)

  • +1

    これまでに試したことを何でも追加してください。ありがとう! – Veeram

    答えて

    1

    を確認してください:

    db.user.aggregate([ 
        { 
         $match:{ 
         $and:[ 
          { 
           timestamp:{ 
            $gte: ISODate("2016-10-12T00:00:00.000Z") 
           } 
          }, 
          { 
           timestamp:{ 
            $lt: ISODate("2016-10-13T00:00:00.000Z") 
           } 
          } 
         ] 
         } 
        }, 
        { 
         $group:{ 
         _id:"$userId", 
         timestamp:{ 
          $first:"$timestamp" 
         }, 
         send_message:{ 
          $sum:{ 
           $cond:[ 
            { 
            $eq:[ 
             "$event_type", 
             "send_message" 
            ] 
            }, 
            1, 
            0 
           ] 
          } 
         }, 
         clicked_cancel:{ 
          $sum:{ 
           $cond:[ 
            { 
            $eq:[ 
             "$event_type", 
             "clicked_cancel" 
            ] 
            }, 
            1, 
            0 
           ] 
          } 
         }, 
         clicked_ok:{ 
          $sum:{ 
           $cond:[ 
            { 
            $eq:[ 
             "$event_type", 
             "clicked_ok" 
            ] 
            }, 
            1, 
            0 
           ] 
          } 
         } 
         } 
        }, 
        { 
         $project:{ 
         date:{ 
          $dateToString:{ 
           format:"%Y-%m-%d", 
           date:"$timestamp" 
          } 
         }, 
         userId:1, 
         clicked_cancel:1, 
         send_message:1, 
         clicked_ok:1 
         } 
        } 
    ]) 
    

    説明:

    $の試合で、特定の日のためだけの文書を保ちますステージ

    グループdoc by userIdそして

    は最終的にあなたが提供されたデータ、この意志出力

    ため yyyy_MM-DD形式で $プロジェクト段階

    にタイムスタンプフィールドをフォーマット$グループ段階で各イベントの発生をカウント

    { 
        "_id":"123123123", 
        "send_message":0, 
        "clicked_cancel":1, 
        "clicked_ok":1, 
        "date":"2016-10-12" 
    } 
    
    +0

    ありがとう!それは私にとってはうまくいく! – Atomx

    1

    あなたは、このような集合体でこれを行うことができます次のクエリ

    db.sandbox.aggregate([{ 
        $group: { 
         _id: { 
          userId: "$userId", 
          date: { 
           $dateToString: { format: "%Y-%m-%d", date: "$timestamp" }} 
          }, 
         send_message: { 
          $sum: { 
           $cond: { if: { $eq: ["$event_type", "send_message"] }, then: 1, else: 0 } } 
          }, 
         clicked_cancel: { 
          $sum: { 
           $cond: { if: { $eq: ["$event_type", "clicked_cancel"] }, then: 1, else: 0 } 
          } 
         }, 
         clicked_ok: { 
          $sum: { 
           $cond: { if: { $eq: ["$event_type", "clicked_ok"] }, then: 1, else: 0 } 
          } 
         } 
        } 
    }]) 
    
    +0

    !それは正しいアプローチに私を指摘:) – Atomx

    関連する問題