我们正在使用MongoDB的副本集,其中包含1个Primary,1个Secondary和1个Arbiter。
在我们的java应用程序中,我们使用Spring-data-mongodb与MongoDB进行交互。 我们的应用程序中的一个关键用例涉及使用带有距离排序的geoNear查询的聚合管道,类似于此(不包括此操作的查询部分 - 但它涉及检查非地理字段,如位置的状态检查
[ { "$geoNear" : { "query" : { ..... } ,
"maxDistance" : 4.7035678286621944E-5 , "distanceMultiplier" : 6378.137 ,
"near" : [ 77.09979953386978 , 28.442629624873796] , "spherical" : true , "distanceField" : "distance"}} ,
{ "$project" : { "distance" : 1}}]
我们已设置了读取操作的副本首选项。 但是,无论我们使用NEAREST还是SECONDARY_PREFERRED作为我们的读取首选项,geonear查询始终定向到主数据库,并且不会在副本集中进行平衡。
我们在这里遗漏了什么吗?根据mongodb操作,geoNear查询包含在遵循指定的读取首选项的操作中。
答案 0 :(得分:1)
事实证明,spring-data-mongodb没有将mongoTemplate上指定的读取首选项传递给基础com.mongodb.Mongo连接池 - 用于聚合。它会传递简单查找操作的读取首选项。
我们必须修改我们的spring配置 - 不使用spring数据的mongo:mongo,它没有提供指定读取首选项的功能 - 但编写我们自己的Factory bean来创建我们可以在com.mongodb上设置读取首选项的地方.Mongo。通过它,我们能够将我们的geonear聚合查询引导到我们指定的任何读取首选项。