确保使用 lambda 复合索引

Ensure utilization of compound index with lambda

我们使用 mongocsharpdriver (v2.0.0) API 通过两个字段查询 schools 集合,例如:

db.GetCollection<School>("schools").Find(x => x.City == myCity && x.State == myState);

lambda 表达式中列出的字段的顺序是否会生成查询以利用具有相同顺序的复合索引:{ "city": 1, "state": 1 }?

我是 mongodb 的新手,但如果我理解正确,我们可以创建第二个(反向)复合索引:{ "state": 1, "city": 1 } 以确保使用其中一个。我只是对 lambda 的翻译方式更感兴趣,但在 mongodb 的文档中找不到我要找的东西。

根据 this answer,您不能也不应该依赖 json 中特定属性的顺序。由于这是 MongoDB 存储数据的方式,因此这扩展到 Monogo - 无法确保属性顺序,顺便说一下数据定义的方式,你不应该这样做。

免责声明 这就是 SQL 使用 Lambda 的方式,并且可能仅适用于 MonogDB 驱动程序的工作方式。 至于如何使用 lambda 语句,如果您使用的方法采用 Expression<TDellegate> 类型的参数,它接收表达式树而不是实际方法,这意味着您创建的语句的元数据而不是编译的代码。然后可以在交付数据以将其转换为数据库所需的查询时使用它。

构建查询的顺序,无论是通过显式输入 json 还是从 lambda 表达式生成它 对索引选择没有影响

当您在 MongoDB 中有一个复合索引时,属性 在索引 中的顺序很重要,但查询中的顺序并不重要。

您的索引 { "city": 1, "state": 1 } 可以完全相同地满足这两个查询:

db.GetCollection<School>("schools").Find(x => x.City == myCity && x.State == myState);
db.GetCollection<School>("schools").Find(x => x.State == myState && x.City == myCity);

当您使用单个 属性 时就会出现差异,因此:

db.GetCollection<School>("schools").Find(x => x.City == myCity);

比这更适合您的索引:

db.GetCollection<School>("schools").Find(x => x.State == myState);

MongoDB : Indexes order and query order must match?

中的更多内容