确保使用lambda的复合指数

时间:2015-05-15 01:55:41

标签: c# mongodb lambda mongodb-.net-driver

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

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

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

我对mongodb相当新,但如果我理解正确,我们可以创建第二个(反向)复合索引:{ "state": 1, "city": 1 }以确保使用其中一个。SVGDOMImplementation。我更感兴趣的是如何翻译lambda并且无法在mongodb的文档中找到我想要的内容。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

构建查询的顺序,无论是通过明确键入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?

中的更多内容