1

我正在尝试mongodb使用$within运算符进行地理空间查询。我有一个包含位置字段的集合条目:

location: {
  bounds: {
    south_west: { lat: XX.XXXXXX, lng: XX.XXXXX },
    north_east: { lat: XX.XXXXXX, lng: XX.XXXXX }
  },
  center: {
    lat: XX.XXXXXX,
    lng: XX.XXXXXX
  }
}

对于我的查询,我想获取所有位于对象location.center范围内的位置google.maps。我有这样的事情:

query = {}

var southWest = map.getBounds().getSouthWest();
southWest = [southWest.lat(), southWest.lng()];

var northEast = map.getBounds().getNorthEast();
northEast = [northEast.lat(), northEast.lng()];

query["location.center"] = { $within: { $box: [southWest, northEast] } }

但我一直得到

Exception from Meteor.flush: Error: Unrecognized key in selector: $within
at Error (<anonymous>)
at Function.LocalCollection._exprForConstraint (http://localhost:3000/packages/minimongo/selector.js?2373a18a9a4640513e41d7850f17f62f76b7c589:559:11)
at Function.LocalCollection._exprForOperatorTest (http://localhost:3000/packages/minimongo/selector.js?2373a18a9a4640513e41d7850f17f62f76b7c589:468:36)
at Function.LocalCollection._exprForKeypathPredicate (http://localhost:3000/packages/minimongo/selector.js?2373a18a9a4640513e41d7850f17f62f76b7c589:387:34)
at Function.LocalCollection._exprForSelector (http://localhost:3000/packages/minimongo/selector.js?2373a18a9a4640513e41d7850f17f62f76b7c589:307:36)
at Function.LocalCollection._compileSelector (http://localhost:3000/packages/minimongo/selector.js?2373a18a9a4640513e41d7850f17f62f76b7c589:284:24)
at new LocalCollection.Cursor (http://localhost:3000/packages/minimongo/minimongo.js?7f5131f0f3d86c8269a6e6db0e2467e28eff6422:71:39)
at LocalCollection.find (http://localhost:3000/packages/minimongo/minimongo.js?7f5131f0f3d86c8269a6e6db0e2467e28eff6422:57:10)
at _.extend.find (http://localhost:3000/packages/mongo-livedata/collection.js?3ef9efcb8726ddf54f58384b2d8f226aaec8fd53:155:34)
at Template.feed.feed_items (http://localhost:3000/client/modules/js/feed.js?5ed30ddbd861944b636dbe03c13cc80421258a5b:129:17) 

而且我不确定如何进行。通过一个简单的 JSON.stringify(query) 我注意到查询的结果就像

{"location.center":{"$within":{"$box":[[39.93623526127148,-75.63687337060549],[39.984129247435064,-75.57438862939455]]}}}

无论如何我可以防止引号被环绕$within$box选择器?我相信这就是我的异常被抛出的地方。

4

2 回答 2

4

引号不是问题,这只是有效的 JSON。问题是 minimongo 还没有实现 $within 。Matt Debergalis评论了 Minimongo 的不完整状态(2012 年 10 月 23 日):

最近流星谈话的流量提醒我 minimongo 带有一个健康的改进和扩展愿望清单。

[...]

  • $near、$within 和 $maxDistance。

在您具有“真正” mongodb 访问权限的服务器上执行此操作可能会更好,但如果客户端商店没有相同的功能,我不确定它是如何工作的。

Minimongo 的源代码是可用的。也许您应该尝试自己实现这个选择器并发送拉取请求?:)

于 2013-01-10T16:47:42.697 回答
0

这可能是一个老问题,但万一有人重新访问这个问题,您可以使用它对 minimongo 进行查询:

locations.find(
    { "location.lng" : {
        "$gt" : bottomLeftLng,
        "$lt":  topRightLng  
      },
      "location.lat": {
        "$gt" : bottomLeftLat,
        "$lt": topRightLat
      }
   }
)
于 2013-03-24T18:19:36.373 回答