現在、集計フレームワークを使用して、コレクションの集計値を計算しています。典型的なクエリ/操作には、インデックス化された 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"
}
}
});