如何对两个属性进行地理搜索而不是[lng,lat]数组?

时间:2014-05-06 10:04:04

标签: mongodb mongoose geo

我已经能够找到的Mongo地理搜索的所有示例和实现都使用数组属性[lng, lat]来执行搜索:

示例记录将是:

{
   name: 'foo bar',
   locations: [
     {
       name: 'franks house',
       geo: [-0.12, 34.51]
     },
     {
       name: 'jennifers house',
       geo: [-0.09, 32.17]
     }
   ]
}

结果查询:

db.events.find({ 'locations.geo': { $nearSphere: [ -0.12, 34.51 ], $maxDistance: 0.02 }})

这很好用,但是记录的格式对于用户来说不是很好读或写,因为它不是自我记录latlng进入该数组的地方。陷入困境的空间。我想让记录更加人性化:

{
   name: 'foo bar',
   locations: [
     {
       name: 'franks house',
       lat: 34.51,
       lng: -0.12
     },
     {
       name: 'jennifers house',
       lat: 32.17,
       lng: -0.09
     }
   ]
}

这种类型的记录会产生什么样的mongo查询?我还没有找到任何这方面的例子,所以我想知道它是否可能。

1 个答案:

答案 0 :(得分:1)

不建议为纬度和经度使用单独的字段。 2dsphere索引用于索引需要坐标数组的地理空间数据,请参阅documentation。这就是您无法找到单独坐标字段的示例的原因。

您应该将表示与数据存储分开。仅仅因为坐标存储在数组中,您不一定需要将它们作为数组呈现给用户。例如,您可以在保存时使用预调用来在数组中存储单独的参数,例如:

var schema = new Schema(..);
schema.pre('save', function (next) {
  this.coordinates = [this.longitude, this.latitude]
  next();
});