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

标签 c# mongodb

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

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

因此,如果有人输入“sun bat”作为搜索词,我将创建一个正则表达式,如下所示 (?=.\bsun)(?=.\bbat).* 这应该匹配名字或姓氏或公司名以“sun”开头且名字或姓氏或公司名以“sun”开头的任何索引条目' bat '。

如果我这样做不行,那我怎么办呢?用户只是键入他们的搜索词,所以我不知道每个搜索词(sun 或 bat)指的是哪个元素(名字、姓氏、公司名)。

最佳答案

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

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


好问题。请记住这一点:

  1. MongoDB 每次查询只能使用一个索引。
  2. 使用正则表达式的查询仅在正则表达式为根且区分大小写时使用索引。

跨多个字段进行搜索的最佳方法是为每个文档创建一组搜索词(小写)并为该字段建立索引。这利用了 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#,但即使语法可能不同,概念也会转换。

关于c# - MongoDB 在正则表达式查询中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8431296/

相关文章:

c# - 如何复制粘贴 WPF 窗口(克隆)并且没有错误

c# - 使用字符串插值将字符串转换为大写

c# - 将 Angular 变量传递给 Razor 函数调用

c# - 同一页面上的多个模板

mongodb - Modulus 上的 Meteor 应用程序——如何重置数据库

java - 将数据从 PostgreSQL 迁移到 MongoDB

mongodb - Doctrine MongoDB ODM 身份验证,可能吗?

json - MongoDB 更改/更新子文档字段

node.js - mongoose.model( 'Foo',FooSchema)与要求( './models/Foos')

c# - 如何使 DTO 属性对于 json 模式可选