2

我有一个使用 Spring Data 的 NearQuery 操作执行的近距离查询。大多数情况下一切正常。但是,我在几台测试机器和一台生产机器上都有我的代码。该查询适用于某些测试机器,但它不会返回生产机器和我的一台测试机器上新创建的对象的结果。当我将 mongodb 集合放在不工作的机器上,然后使用相同的代码插入新文档并重新创建集合时,查询再次开始工作。我的问题是;什么会导致这种行为?向类中添加新变量会导致 mongodb near 查询停止执行吗?如果添加到集合中的文档与已经存在的变量不同,会导致问题吗?在生产中,我不能简单地删除集合来解决这个问题。

mongoTemplate 代码:

    Point point = new Point(locationAsDoubleArray[0],locationAsDoubleArray[1]);

    NearQuery query = NearQuery.near(point.getX(),point.getY()).spherical(true).maxDistance(maxDistance,Metrics.MILES).distanceMultiplier(Metrics.MILES).query(regularQuery);//maxDistance(new Distance(radius,Metrics.MILES));


    GeoResults<CalendarEvent> results = ((MongoOperations)mongoTemplate).geoNear(query, CalendarEvent.class);

应以 JSON 格式返回的文档:

    { "_class" : "com.eatmyfish.services.custom.CalendarEvent" , "_id" : { "$oid" : "5011c5cf51527fce6c4d2a00"} , "_keywords" : [ "test" , "search" , "function" , "test" , ""] , "address1" : "221 East 5th Street" , "address2" : "" , "allDay" : false , "categories" : [ 14] , "city" : "Saint Paul" , "clientId" : 109 , "clientProductId" : 962 , "color" : "#003666" , "createUser" : "peterson.dean" , "description" : "test" , "end" : "2012-07-26 14:00:00" , "endDate" : { "$date" : "2012-07-26T19:00:00.000Z"} , "externalLink" : "<a href='http://'>More Info</a>" , "geoLocation" : [ -93.0875195 , 44.9490055] , "latitude" : 0.0 , "location" : "221 East 5th Street  Saint Paul,MN 55101 " , "locationManuallyEntered" : false , "locationName" : "My Cubicle" , "longitude" : 0.0 , "moreInfoLink" : "<a href='http://localhost:8080/posts/list/3150.page'>More Info</a>" , "note" : "" , "privateEventIn" : "N" , "restFormattedAddress" : "221+East+5th+Street+Saint+Paul,+MN+55101" , "start" : "2012-07-26 04:00:00" , "startDate" : { "$date" : "2012-07-26T09:00:00.000Z"} , "state" : "MN" , "title" : "Test Search Function" , "topicId" : 3150 , "url" : "http://localhost:8080/posts/list/3150.page" , "zip" : "55101"}

代码的工作方式因它正在运行的机器而异。我确保我的 jar 文件等在每台机器上都是相同的。一旦开始失败,唯一能使查询工作的方法是删除集合并重新开始。但是,我不确定何时或什么原因导致查询停止工作。我不认为代码是问题。可能有一些我不知道的管理任务会清理数据。我已经使用了修复命令,但没有任何运气。

4

1 回答 1

3

我有一些旧条目的长/纬度顺序颠倒了。这导致我所有的近距离查询都失败了。奇怪的是,以相反的顺序有几个 long/lat 值会导致这种情况。不过,这就是原因。当我反向修复条目的 long/lats 的顺序时,查询再次起作用。为了找出这一点,我必须在 java 中构建和使用直接的 mongodb 命令,而不是使用 Spring 的简洁方法。通过在调试时查看命令的返回值,我实际上可以看到有关纬度值不正确的错误消息。使用 Spring 的近查询操作没有返回此类错误。Spring 不充分的错误消息使这个错误很难追踪。

于 2012-07-27T22:04:57.470 回答