Mongodb 如何对两处房产进行地理搜索,而不是对[lng,lat]数组进行地理搜索?

Mongodb 如何对两处房产进行地理搜索,而不是对[lng,lat]数组进行地理搜索?,mongodb,mongoose,geo,Mongodb,Mongoose,Geo,我在Mongo中找到的所有geo search示例和实现都使用数组属性[lng,lat]对以下对象执行搜索: 一个示例记录是: { name: 'foo bar', locations: [ { name: 'franks house', geo: [-0.12, 34.51] }, { name: 'jennifers house', geo: [-0.09, 32.17] } ]

我在Mongo中找到的所有geo search示例和实现都使用数组属性
[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 }})
这可以很好地工作,但是记录的格式对于用户读写来说不是很好,因为它不是在
lat
lng
进入该数组的地方进行自我记录。这里有地方给哥查斯。我想让这些记录更人性化:

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

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

不建议对纬度和经度使用单独的字段。2dsphere索引用于索引需要坐标数组的地理空间数据,请参见。这就是为什么找不到单独坐标字段的示例

您应该将表示与数据存储分开。因为坐标存储在一个数组中,所以您不必将它们作为数组呈现给用户。例如,您可以使用save上的预调用在数组中存储单独的参数,例如:

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

如果您想使用您提供的mongo geo操作符来保持[lon,lat]格式。无论如何,只是一个小提示,通常“用户”不应该直接从数据库(MVC?)读/写。这是一个RESTAPI,我需要最简单的方法来返回JSON结果。它不需要与数据库结构完全相同,但所需的数据格式化越少,响应时间就越快。是的,这是我的第二个选择,但我想先检查一下。您的答案几乎是全面的,但我在这种方法中遇到的一个问题是如何获取结果并轻松地转换回用户友好的数据结构。我在Mongoose中找不到任何东西,比如
schema.post('find',…
)或其他什么东西。您能详细说明一下吗?所以,无论何时进行查询并返回,对doc对象所做的任何修改都将应用于所有对象结果吗?我不能肯定,但我认为是这样。如果它不起作用,那么您可以使用
toObject()
,然后将其传递到
JSON.stringify()
。您可以在此处找到示例: