MongoDB:优化了多个集合的搜索

时间:2017-02-09 21:01:37

标签: javascript regex mongodb

我想改进我的搜索方法 - 它应该不区分大小写。在我的设置中有五个不同的集合,我想搜索它们的title字段。 此外,我还需要获得部分结果(至少3个字符)。

示例

// Collection 1
{ title: 'Sample' },
{ title: 'Another sample' }
{ title: 'This is an example' }

// Collection 2
{ title: 'Something else' },
{ title: 'A sample document' }
{ title: 'This is another example' }
  1. Ample:所有文件,第二个集合中的第一个
  2. 除外
  3. Sample:集合1的前两个文档和集合2的第二个文档
  4. another:第1号收集文件
  5. is:不应该提供任何结果(<3个字符)
  6. 到目前为止,我用这个

    做到了
    db.collection.find({ title: new RegExp(value, 'i') }).fetch()
    

    ...为每个集合并将结果合并到一个数组中。

    但我认为这不是最佳的,因为正在使用正则表达式,所有文档都必须由db搜索。

    所以我转而使用全文搜索。我为title添加了一个索引并尝试了这个:

    db.collection.find({ $text: { $search: value } }).count()
    

    但是Samp甚至没有给我第一份文件。

    最后但并非最不重要的是,我不知道如何搜索所有五个集合以获得所有匹配作为一个结果。

1 个答案:

答案 0 :(得分:0)

这是MongoDB手册所说的:

  

对于区分大小写的正则表达式查询,如果存在索引   该字段,然后MongoDB匹配正则表达式   索引中的值,可以比集合扫描更快。   如果正则表达式是“前缀”,则可以进一步优化   表达式“,这意味着所有潜在的匹配都以   同一串。这允许MongoDB从中构建“范围”   前缀,仅匹配来自下降的索引中的值   在这个范围内。

     

正则表达式是一个“前缀表达式”,如果它以a开头   插入符号(^)或左侧锚点(\ A),后跟一串简单的   符号。例如,regex /^abc.*/将通过匹配进行优化   仅针对以abc开头的索引中的值。

这很重要:

  

对于不区分大小写的正则表达式查询,这些查询   一般不能有效使用指标。

对于您的情况,您应该使用$regex关键字并在.* var中使用value

db.collection.find({ $text: { $regex: value, options: 'i' } }).count()

关于你的上一个问题 - 我没有看到任何其他解决方案,而是在每个集合上执行find,通过.forEach传递结果并将结果附加到同一个数组/对象。

相关问题