我目前正在使用聚合框架来计算集合上的一些聚合值。典型的查询/操作可能包括近 100 万个被索引的文档(f1/ts 匹配将文档数量从大约 500 万个减少到 100 万个,该集合可以根据查询参数(例如时间范围)变得更小选择)。
$match使用文档的索引属性,但我需要包括相当于全文搜索的内容。我使用的唯一选项是$regex匹配。不幸的是,我无法将我的$regex匹配锚定到字符串的开头,因为我正在寻找的字符串可能在任何地方。我正在“搜索”的文本长度可能从几个字符到几千个字符不等。
仅运行一些基本比较,包含$regex匹配属性几乎使计算完成的时间增加了一倍。
- 我有哪些优化此操作的选项?
- 是否有可能以其他方式实现这一目标?
- 文本搜索是否可用于 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"
}
}
});