2016-11-30 8 views
1

のは、私は巨大な文書のこの2を持っているとしましょう:mongoDBの集計クエリを改善するには?

[ 
{ 
    _id: ...., 
    status: "A", 
    class: "DIP1A", 
    "created.user._id": ..., 
    "created.dt": ...., 
    "category": "private", 
    price: 100.00 //type double 
}, 
{ 
    _id: ...., 
    status: "A", 
    class: "DIP2A", 
    "created.user._id": ... 
    "created.dt": ..., 
    "category": "public", 
    price: 200.00 //type double 
}, 
]; 

問合せ:

var pipeline = [ 

       { 
       $match: { 
        "created.user._id": .... 
       } 
       }, 
       { 
       $unwind: "$class" 
       }, 
       { 
       $unwind: "$price" 
       }, 
       { 
       $group: { 
        _id: "$class", 
        price: { 
        $sum: "$price" 
        }, 
        count: { 
        $sum: 1 
        } 
       } 
       }, 
       { 
       $project: { 
        _id: 0, 
        class: '$_id', 
        count: 1, 
        price: 1 
       } 
       } 
    ]; 

db.myCollection.aggregate(pipeline); 

問題問題:

  • クエリ計算/ $和なし "$価格"、それが実行しています本当に速い。

インデックス:

db.myCollection.ensureIndex({ 'created.user._id': -1 }); 
db.myCollection.ensureIndex({ 'created.user._id': -1, class: 1 }); 
db.myCollection.ensureIndex({ 'created.user._id': -1, price: 1}); 

パフォーマンス:$和カルクなし

  • :レコードの巨大で5秒。
  • with $ sum cals:膨大なレコードを含む20分。
+1

:それは;-)

と同様にコピー/ペーストの問題だろうか?それを取得するには、db.myCollection.aggregate(パイプライン、{説明:true})を実行します。 – felix

答えて

0

あなたが本当にすべきことは、$ matchステージの直後に$ projectステージを移動することです(もしドキュメントにあなたの質問(巨大ドキュメント)にもっと多くのデータが含まれていれば)。 パイプラインを通じてできるだけ少ないデータを必要とします。 また、私は価格とクラスで$ unwindを見ますが、あなたの例では配列ではありません。あなたは2つのクエリの説明を追加することができます

var pipeline = [ 

      { 
      $match: { 
       "created.user._id": .... 
      } 
      }, 
     { 
      $project: { 
       _id: 0, 
       class: '$_id', 
       count: 1, 
       price: 1 
      } 
      }, 
      { 
      $unwind: "$class" 
      }, 
      { 
      $unwind: "$price" 
      }, 
      { 
      $group: { 
       _id: "$class", 
       price: { 
       $sum: "$price" 
       }, 
       count: { 
       $sum: 1 
       } 
      } 
      }, 
];