17

随着2.3 >MongoDB 的引入,位置数据处理和查询变得更加有用。MongoDB 将文档存储为 BSON,因此每个文档都具有所有文档字段,这显然可能导致比我们传统的 RMDBS 更大的数据库。

我曾经将折线和多边形存储为一系列索引点,并使用一个额外的字段表示每条线的顺序(我这样做是为了确保在使用 JavaScript 时的一致性,因此点并不总是以正确的顺序存储)。是这样的:

polyline: {
  [
    point: [0,0],
    order: 0
  ],
  [
    point: [0,1],
    order: 1
  ]
}

而现在我使用:

polyline: {
  type: 'LineString',
  coordinates: [
    [0,0],
    [1,0]
  ]
}

我已经看到文档大小有所改进,因为一些折线可以有多达 500 个点。

但是,我想知道按原样存储所有Point数据有什么好处GeoJSON。我对文档大小的增加感到沮丧,例如:

loc: [1,0]

loc: {
  type: 'Point',
  coordinates: [0,1]
}

因此会更容易使用。

我的问题是:

将点存储为GeoJSON对象而不是 2 点数组是否更好/推荐?

我考虑过的是:

  • 大小限制:我可能有数百万个带有位置的文档,这可能会影响集合的大小,并可能影响我的口袋。
  • 一致性:最好处理lng, lat格式中的每一组坐标,而不是坚持lat, lng点,前者用于我的所有其他位置特征。
  • 方便:如果我抓住一个点,并使用$geoWithin$geoIntersects,我不需要先将它转换为 GeoJSON,然后再将它用作query参数。

我不确定的是:

  • 未来是否loc: [x,y]会在 MongoDB 上放弃对 的支持
  • 任何索引都受益2dsphere2d
  • 对 MongoDB 的任何计划GeoJSON添加是否可能导致需要上述一致性。

我宁愿GeoJSON在我的数据仍然可以管理的时候搬到那里,而不是在未来承受很大压力的情况下切换。

请我请求一个彻底(即使是稍微)深思熟虑的答案。我不会很快选择正确的答案,所以我可以评估任何回复

我也不确定 SO 是否是提出问题的正确位置,所以如果 DBA 是一个更合适的位置,我会将问题移到那里。我之所以选择 SO,是因为这里有很多与 MongoDB 相关的活动

4

3 回答 3

17

我建议使用新的 GeoJSON 格式。虽然我不相信有任何关于放弃对旧格式的支持的公告,但他们将其称为旧格式这一事实应该表明他们的观点。

使用 2dsphere 而不是 2d 有一些索引优势。

  • 首先,它实际上基于地球是一个球体来计算查询。2d 索引的一个缺点是它没有考虑到这意味着如果您对查询所涵盖的实际区域而不是基本的纬度/经度感兴趣,则必须自己处理转换。
  • 使用复合索引的能力,如果你想做一些事情,比如“首先从这个区域获取 100 个结果”,那么 2dsphere 是你唯一的选择。
  • 使用 geoIntersects 查询的能力。
  • geoWithin 几何查询要求您使用 geoJSON 格式。

另一件需要注意的重要事情是,您需要确保您使用的查询受您使用的索引的支持。例如,如果您使用 2dsphere,则不能使用 $box 查询,因为它不会被索引 - 但是mongo 不会警告您- 结果只会执行表扫描并且会非常慢!

Mongo 提供了哪些查询可以与哪些索引一起使用的兼容性图表

于 2013-05-28T09:55:35.793 回答
4

是的,我认为这是值得的。根据我对地理空间信息系统的经验,最好将您的位置数据存储在一个有用且可转移的标准中。MongoDB 中的 GeoJSON 支持WGS84数据标准。

在 MongoDB 中,$near运算符可以搜索传统的 2d 坐标和 GeoJSON 坐标。在旧的二维坐标集合上,$near 返回最接近的第一个排序集合。$geoNear返回距离搜索点元数据最近的第一个排序集合。

另一个好处是能够使用其他地理空间查询(即 $geoWithin 和 $geoIntersect),特别是如果您存储其他 GeoJSON 类型(折线、多边形)

最后,虽然 2d 索引支持使用球面距离的基本查询,但如果您的数据主要是经度和纬度,请考虑移动到 2dsphere 索引。

我希望这些信息能给您一些关于如何处理您的位置数据的思考点。

于 2013-05-16T23:59:22.787 回答
2

如果您仅在数据库中存储点几何图形,但希望支持对该数据的多个不同GeoJSON 查询,请注意,可以以旧坐标对格式存储点使用2dsphere索引。

mongoose 的GeoJSON 支持 (MongoDB >= 2.4)发行说明给出了以下示例:

2dsphere旧坐标对的索引:

new Schema({ 
    loc: { type: [Number], index: '2dsphere'}
});

GeoJSON2dsphere使用索引查询旧坐标对:

var geojsonPoly = { 
    type: 'Polygon', 
    coordinates: [[[-5,-5], ['-5',5], [5,5], [5,-5],[-5,'-5']]] 
};

Model.find({ loc: { $within: { $geometry: geojsonPoly }}});
于 2014-05-26T23:25:04.160 回答