0

我目前正在使用聚合框架来计算集合上的一些聚合值。典型的查询/操作可能包括近 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"
     }
   }
 });
4

0 回答 0