[英]MongoDB: Optimized search of multiple collections
我想改善我的搜索方法-应该不区分大小写。 在我的设置中,有五个不同的集合,我想搜索它们的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' }
Ample
:所有文件,第二个收藏集的第一个除外 Sample
:集合1的前两个文档和集合2的第二个文档 another
:收集的第二份文件1 is
:不应给出任何结果(<3个字符) 到目前为止,我已经做到了
db.collection.find({ title: new RegExp(value, 'i') }).fetch()
...对于每个集合,并将结果合并到一个数组中。
但是我认为这不是最佳选择,因为使用了正则表达式,并且所有文件都必须由数据库搜索。
因此我转向使用全文搜索。 我在title
添加了索引并尝试了以下操作:
db.collection.find({ $text: { $search: value } }).count()
但是后来Samp
甚至没有给我第一份文件。
最后但并非最不重要的一点是,我不知道如何对所有五个集合进行搜索以将所有匹配项作为一个结果。
这是MongoDB手册所说的:
对于区分大小写的正则表达式查询,如果该字段存在索引,则MongoDB会将正则表达式与索引中的值进行匹配,这可能比集合扫描更快。 如果正则表达式是“前缀表达式”,则可能会发生进一步的优化,这意味着所有潜在的匹配都以相同的字符串开头。 这允许MongoDB从该前缀构造一个“范围”,并且仅与该范围内的索引值匹配。
如果正则表达式以尖号(^)或左锚(\\ A)开头,后跟一串简单符号,则为“前缀表达式”。 例如,将仅通过匹配索引中以abc开头的值来优化正则表达式/^abc.*/。
这很重要:
对于不区分大小写的正则表达式查询,这些查询通常无法有效使用索引。
对于您的情况,您应该使用$regex
关键字,并在value
var中使用.*
。
db.collection.find({ $text: { $regex: value, options: 'i' } }).count()
对于您的最后一个问题-除了在每个集合上进行find
,将结果通过.forEach
传递并将结果附加到同一数组/对象外,我没有其他解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.