确保使用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的文档中寻找的东西。
构建查询的顺序,无论是显式键入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>
类型的参数,那么它将接收表达式树而不是实际的方法,这意味着您所创建的语句的元数据而不是编译的代码。然后可以在交付数据时使用它来转换为数据库所需的查询。