1

mongodb に対して集計クエリを実行する最も効率的な方法を探しています。

現在、さまざまな情報と、ドキュメントが作成された日時のスタンプを含むドキュメントを挿入しています。

このデータを合計して、次の方法で表示する必要があります。

時刻別ドキュメント 1-24 日別ドキュメント 1-28/31 月別ドキュメント 1-12 年別ドキュメント

この合計されたデータは頻繁にアクセスされます。これは、mongo でスローされた大量のデータが、このデータを頻繁に合計する際に問題が発生することを懸念しているためです。

おそらく、ドキュメントが mongo に挿入されたときに、挿入時にインクリメントするこれらのカウントを含む別のドキュメントがあると考えました。このようにして、リクエストごとにデータを合計することなく、カウントをすばやく取得できます。私たちの懸念は、これがmongoでこの種の操作を実行する最も効率的な方法ではないかもしれないということです

これを達成するための最良の方法について何か考えはありますか? 私の開発チームも私自身も mongodb を初めて使用するので、大量のデータ セットを合計することでパフォーマンス トラップに陥らないようにしたいと考えています。

4

1 に答える 1

1

Aggregation Frameworkは、このタイプのクエリに最適です。
以下にいくつかの例を示しました。

まず、いくつかのドキュメントを作成しましょう。

db.myDocumentCollection.insert({"date" : new Date('01/01/2012'), "topic" : "My Title 1"}); db.myDocumentCollection.insert({"date" : new Date('01/02/2012'), "topic" : "My Title 2"}); db.myDocumentCollection.insert({"date" : new Date('01/02/2012'), "topic" : "My Title 3"}); db.myDocumentCollection.insert({"date" : new Date('01/02/2012'), "topic" : "My Title 4"}); db.myDocumentCollection.insert({"date" : new Date('01/04/2012'), "topic" : "My Title 5"}); db.myDocumentCollection.insert({"date" : new Date('01/05/2012'), "topic" : "My Title 6"}); db.myDocumentCollection.insert({"date" : new Date(' 01/07/2013'), "トピック" : "私のタイトル 7"}); db.myDocumentCollection.insert({"date" : new Date('01/07/2013'), "topic" : "My Title 8"}); db.myDocumentCollection.insert({"date" : new Date('02/07/2013'), "topic" : "My Title 9"}); db.myDocumentCollection.insert({"date" : new Date('02/08/2013'), "topic" : "My Title 10"});

完全な日付でグループ化されたドキュメントの数を返す

db.myDocumentCollection.group(
{
   $keyf : function(doc) {
       return { "date" : doc.date.getDate()+"/"+doc.date.getMonth()+"/"+doc.date.getFullYear() };
    },
    initial: {count:0},
    reduce: function(obj, prev) { prev.count++; }
 })

出力

[
        {
                "date" : "1/0/2012",
                "count" : 1
        },
        {
                "date" : "2/0/2012",
                "count" : 3
        },
        {
                "date" : "4/0/2012",
                "count" : 1
        },
        {
                "date" : "5/0/2012",
                "count" : 1
        },
        {
                "date" : "7/0/2013",
                "count" : 2
        },
        {
                "date" : "7/1/2013",
                "count" : 1
        },
        {
                "date" : "8/1/2013",
                "count" : 1
        }
]

2013 年の日付ごとにグループ化されたドキュメントの数を返します

これはおそらく、実行したいクエリの種類にもう少し関連しています。
ここでは、 を使用して、2013年 1 月 1 日cond以降のドキュメントをグループ化することのみを指定し
ます。$gte$lte

db.myDocumentCollection.group(
{
   $keyf : function(doc) {
       return { "date" : doc.date.getDate()+"/"+doc.date.getMonth()};
    },
    cond: {"date" : {"$gte": new Date('01/01/2013')}},
    initial: {count:0},
    reduce: function(obj, prev) { prev.count++; }
 })

出力

[
        {
                "date" : "7/0",
                "count" : 2
        },
        {
                "date" : "7/1",
                "count" : 1
        },
        {
                "date" : "8/1",
                "count" : 1
        }
]
于 2012-11-13T11:09:33.850 に答える