【问题标题】:MongoDB: Optimized search of multiple collectionsMongoDB:优化多个集合的搜索
【发布时间】:2017-02-09 21:01:36
【问题描述】:

我想改进我的搜索方法 - 应该不区分大小写。在我的设置中有五个不同的集合,我想搜索它们的 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. Sample:集合1的前两个文档和集合2的第二个文档
  3. another:集合1的第二个文档
  4. is: 不应该给出任何结果(

到目前为止,我已经做到了

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

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

但我认为这不是最佳选择,因为使用了正则表达式,并且所有文档都必须由数据库搜索。

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

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

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

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

【问题讨论】:

    标签: javascript regex mongodb


    【解决方案1】:

    这是 MongoDB 手册所说的:

    对于区分大小写的正则表达式查询,如果存在索引 字段,然后 MongoDB 将正则表达式与 索引中的值,这可能比集合扫描更快。 如果正则表达式是“前缀”,则可以进行进一步优化 表达式”,这意味着所有可能的匹配都以 相同的字符串。这允许 MongoDB 从中构造一个“范围” 前缀,并且只匹配索引中那些下降的值 在那个范围内。

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

    这很重要:

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

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

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

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

    【讨论】:

    • 你共享的查询抛出错误Error: error: { "ok" : 0, "errmsg" : "Missing expected field \"$search\"", "code" : 4, "codeName" : "NoSuchKey" }
    猜你喜欢
    • 2021-04-17
    • 2014-07-31
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多