我想改进我的搜索方法 - 它应该不区分大小写。在我的设置中有五个不同的集合,我想搜索它们的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()
...为每个集合并将结果合并到一个数组中。
但我认为这不是最佳的,因为正在使用正则表达式,所有文档都必须由db搜索。
所以我转而使用全文搜索。我为title
添加了一个索引并尝试了这个:
db.collection.find({ $text: { $search: value } }).count()
但是Samp
甚至没有给我第一份文件。
最后但并非最不重要的是,我不知道如何搜索所有五个集合以获得所有匹配作为一个结果。
答案 0 :(得分:0)
这是MongoDB手册所说的:
对于区分大小写的正则表达式查询,如果存在索引 该字段,然后MongoDB匹配正则表达式 索引中的值,可以比集合扫描更快。 如果正则表达式是“前缀”,则可以进一步优化 表达式“,这意味着所有潜在的匹配都以 同一串。这允许MongoDB从中构建“范围” 前缀,仅匹配来自下降的索引中的值 在这个范围内。
正则表达式是一个“前缀表达式”,如果它以a开头 插入符号(^)或左侧锚点(\ A),后跟一串简单的 符号。例如,regex /^abc.*/将通过匹配进行优化 仅针对以abc开头的索引中的值。
这很重要:
对于不区分大小写的正则表达式查询,这些查询 一般不能有效使用指标。
对于您的情况,您应该使用$regex
关键字并在.*
var中使用value
。
db.collection.find({ $text: { $regex: value, options: 'i' } }).count()
关于你的上一个问题 - 我没有看到任何其他解决方案,而是在每个集合上执行find
,通过.forEach
传递结果并将结果附加到同一个数组/对象。