1

NYC MUG/SimpleReachスキーマに触発されたリアルタイム メトリック システムからレポート データを取得しようとしていますが、おそらく私の心はまだ SQL モードにとらわれています。

データは次のようにドキュメントに保存されます...

{
"_id": ObjectId("5209683b915288435894cb8b"),
"account_id": 922,
"project_id": 22492,
"stats": {
    "2009": {
        "04": {
            "17": {
                "10": {
                    "sum": {
                        "impressions": 11
                    }
                },
                "11": {
                    "sum": {
                        "impressions": 603
                    }
                },
             },
         },
     },
 }}

集約パイプラインのさまざまなバリエーションを試してみましたが、成功しませんでした。

db.metrics.aggregate({
$match: {
    'project_id':22492
}}, {
$group: {
    _id: "$project_id",
    'impressions': {

         //This works, but doesn't sum up the data...
         $sum: '$stats.2009.04.17.10.sum.impressions'

         /* none of these work.
         $sum: ['$stats.2009.04.17.10.sum.impressions',          
              '$stats.2009.04.17.11.sum.impressions']

         $sum: {'$stats.2009.04.17.10.sum.impressions',          
              '$stats.2009.04.17.11.sum.impressions'}

        $sum: '$stats.2009.04.17.10.sum.impressions',          
              '$stats.2009.04.17.11.sum.impressions'
        */
    }
}

任意の助けをいただければ幸いです。

(ps。このドキュメントスキーマを使用して日付範囲検索を行う方法について何か考えがある人はいますか?)

4

1 に答える 1

8

$groupは多くのドキュメントに適用されるように設計されていますが、ここでは一致するドキュメントは 1 つだけです。代わりに、$project 次のように特定のフィールドを合計するために使用できます。

db.metrics.aggregate(
{ $match: {
    'project_id':22492
  }
},
{ $project: {
    'impressions': {
      $add: [
        '$stats.2009.04.17.10.sum.impressions',
        '$stats.2009.04.17.11.sum.impressions'
      ]
    }
  }
})

MongoDB の操作/予測は、ドキュメントのキーではなく値に適用されるように設計されているため、このスキーマで日付範囲検索を行うエレガントな方法はないと思います。私の理解が正しければ、あなたが言及したスライドで最も興味深い点は、更新時にメトリックをキャッシュ/事前集計することです。これは良い考えですが、別のスキーマで実装できます。たとえば、MongoDB でサポートされているインデックスで日付と時刻を使用すると、範囲検索に適している場合があります。集計フレームワークでさえデータ操作をサポートするため、柔軟性が向上します。

于 2013-09-16T20:41:47.597 に答える