0

現在、集計フレームワークを使用して、コレクションの集計値を計算しています。典型的なクエリ/操作には、インデックス化された 100 万近くのドキュメントが含まれる場合があります (f1/ts 一致により、ドキュメントの数が約 500 万から 100 万に減少します。時間枠などのクエリ パラメータに応じて、セットを小さくすることができます)。選択されています)。

$matchはドキュメントのインデックス付き属性を使用しますが、全文検索に相当するものを含める必要があります。私が使用した唯一のオプションは$regexマッチです。残念ながら、探している文字列がどこにでもある可能性があるため、$regexの一致を文字列の先頭に固定することはできません。私が「検索」しているテキストの長さは、数文字から数千文字までさまざまです。

いくつかの基本的な比較を実行するだけで、 $regex一致属性を含めると、計算が完了するまでにかかる時間がほぼ 2 倍になります。

  • この操作を最適化するためのオプションは何ですか?
  • これを他の方法で達成することは可能ですか?
  • v2.6 の集計操作でテキスト検索を使用できますか?

参考のため:

$regex なしの操作

db.my_collection.aggregate(
 {
   $match:{
     f1:ObjectId('417abd81...577000006'),
     ts:{$gte:t1,$lte:t2}
   }
 },{
   $project:{
     ts:1,
     p:1
   }
 },{
   $group:{
     _id:"$ts",
     x: {
       $sum:"$p"
     }
   }
 });

$regex での操作

db.my_collection.aggregate(
 {
   $match:{
     f1:ObjectId('417abd81...577000006'),
     ts:{$gte:t1,$lte:t2}
   }
 },
 {
   $match:{
     c:{$regex: /somevalue/i}
   }
 },{
   $project:{
     ts:1,
     p:1
   }
 },{
   $group:{
     _id:"$ts",
     x: {
       $sum:"$p"
     }
   }
 });
4

0 に答える 0