Spring 数据- MongoDB geoNear 未在副本集中分发

Spring Data- MongoDB geoNear not getting distributed in replicaset

我们正在使用 MongoDB 的副本集,其中包含 1 个主节点、1 个辅助节点和 1 个仲裁节点。

在我们的 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 查询包含在遵守指定读取首选项的操作中。

事实证明,spring-data-mongodb 不会将 mongoTemplate 上指定的读取首选项传递给基础 com.mongodb.Mongo 连接池 - 用于聚合。它将通过简单查找操作的读取首选项。

我们不得不修改我们的 spring 配置——不使用 spring 数据的 mongo:mongo,它不提供指定读取首选项的功能——而是编写我们自己的 Factory bean 来创建同样,我们可以在 com.mongodb.Mongo 上设置阅读首选项。这样我们就能够将我们的 geonear 聚合查询也定向到我们指定的任何读取首选项。