确保使用lambda的复合索引

本文关键字:复合 索引 lambda 确保 | 更新日期: 2023-09-27 17:49:22

我们使用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的文档中寻找的东西。

确保使用lambda的复合索引

构建查询的顺序,无论是显式键入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:索引顺序和查询顺序必须匹配?

根据这个答案,你不能也不应该依赖json中特定属性的排序。因为这是MongoDB存储数据的方式,所以它扩展到Monogo -没有办法确保属性顺序,并且通过定义数据的方式,您不应该这样做。

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