MongoDB在正则表达式查询中使用索引

时间:2011-12-08 12:54:16

标签: c# mongodb

我正在使用官方的C#MongoDB驱动程序。

如果我有三个元素的索引{“firstname”:1,“surname”:1,“companyname”:1}我可以使用与索引值直接匹配的正则表达式搜索集合吗?

所以,如果有人输入“sun bat”作为搜索词,我会按如下方式创建一个正则表达式 (?=。 \ bsun)(?=。 \ bbat)。*这应匹配firstname或surname或companyname以'sun'开头的所有索引条目,其中firstname或surname或companyname以first开头'蝙蝠'。

如果我不能这样做,我该怎么做?用户只需输入他们的搜索字词,因此我不知道每个搜索字词(太阳或蝙蝠)所指的元素(名字,姓氏,公司名称)。

1 个答案:

答案 0 :(得分:7)

更新:对于MongoDB 2.4及更高版本,您不应使用此方法,而应使用MongoDB's text index

以下是MongoDB的原始且仍然相关的答案< 2.4。


好问题。记住这一点:

  1. MongoDB每个查询只能使用一个索引。
  2. 使用正则表达式的查询仅在正则表达式为root并且区分大小写时才使用索引。
  3. 跨多个字段进行搜索的最佳方法是为每个文档创建一个搜索项数组(小写)并索引该字段。这利用了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#,但即使语法可能不同,概念也会翻译。