我正在使用官方的C#MongoDB驱动程序.
如果我有三个元素的索引{"firstname":1,"surname":1,"companyname":1}我可以使用与索引值直接匹配的正则表达式搜索集合吗?
因此,如果有人输入"sun bat"作为搜索词,我会创建一个正则表达式,如下所示(?=.\ bsun)(?=.\bbat).*这应匹配任何索引条目,其中firstname或surname或companyname以'sun'开头,其中firstname或surname或companyname以'bat'开头.
如果我不能这样做,我该怎么办呢?用户只需输入他们的搜索字词,因此我不知道每个搜索字词(太阳或蝙蝠)所指的元素(名字,姓氏,公司名称).
更新:对于MongoDB 2.4及更高版本,您不应使用此方法,而应使用MongoDB的文本索引.
以下是MongoDB <2.4的原始且仍然相关的答案.
好问题.记住这一点:
MongoDB每个查询只能使用一个索引.
使用正则表达式的查询仅在正则表达式为根并且区分大小写时才使用索引.
跨多个字段进行搜索的最佳方法是为每个文档创建一个搜索项数组(小写)并索引该字段.这利用了MongoDB的多键功能.
因此文档可能如下所示:
{ "firstname": "Tyler", "surname": "Brock", "companyname": "Awesome, Inc.", "search_terms": [ "tyler", "brock", "awesome inc"] }
你会创建一个索引: db.users.ensureIndex({ "search_terms": 1 })
然后当有人搜索"Tyler"时,你粉碎案例并使用与字符串开头匹配的区分大小写的正则表达式搜索集合:
db.users.find({ "search_terms": /^tyler/ })
mongodb在执行此查询时所做的是尝试将您的术语与数组的每个元素匹配(索引也是这样设置的 - 所以它很快).希望这能让你到达你需要的地方,祝你好运.
注意:这些示例位于shell中.我从来没有写过一行C#,但即使语法可能不同,概念也会翻译.