随着2.3 >
的引入,MongoDB在处理和查询位置数据方面变得更加有用。MongoDB将文档存储为BSON格式,因此每个文档都包含所有文档字段,这显然可能会导致比传统关系型数据库更大的数据库。
我曾经将折线和多边形存储为一系列索引点,还有一个额外的字段表示每条线的顺序(我这样做是为了确保一致性,因为我使用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]
}
因此更容易处理,
我的问题是:
与将点存储为2点数组相比,将点存储为 GeoJSON
对象是否更好/推荐?
我考虑了以下内容:
- 大小约束:我可能会有数百万个具有位置的文档,这可能会影响集合的大小,并潜在地影响我的钱包。
- 一致性:最好使用
lng,lat
格式来处理每组坐标,而不是针对点采用lat,lng
,并针对所有其他位置功能使用lng,lat
。 - 方便性:如果我获取一个点,并使用
$geoWithin
或$geoIntersects
,则在将其用作query
参数之前,我无需先将其转换为GeoJSON。
我不确定的是:
- 未来MongoDB是否会停止支持
loc:[x,y]
- 与
2d
相比,是否有任何2dsphere
的索引优势 - 是否会有任何计划中的
GeoJSON
添加到MongoDB可能会导致需要上述一致性的情况。
在我的数据仍然可管理的情况下,我宁愿转移到 GeoJSON
,而不是在未来承受很大压力时再进行切换。
我可以请求一个经过彻底(即使略微)思考的答案。我不会立即选择正确的答案,以便评估任何回复。
我也不确定SO是否是提出问题的合适场所,因此如果DBA是更合适的地方,我将在那里移动问题。我选择SO是因为这里有很多与MongoDB相关的活动。