草庐IT

mongodb - GeoJSON 和 MongoDB : Is it worth it to store points as GeoJSON. 点?

coder 2023-05-04 原文

随着 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 点,前者用于我的所有其他位置功能。<​​ i="">
  • 方便:如果我捕获一个点,并使用 $geoWithin$geoIntersects ,我不需要先将其转换为 GeoJSON 再使用它作为 查询 参数。

我不确定的是:

  • future 是否会在 MongoDB 上放弃对 loc: [x,y] 的支持
  • 2d
  • 相比,2dsphere 的任何索引优势
  • 任何计划中的 GeoJSON 添加到 MongoDB 是否可能导致需要上述一致性。

我宁愿在我的数据仍可管理的情况下迁移到 GeoJSON,也不愿在未来承受很大压力时切换。

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

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

最佳答案

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

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

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

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

Mongo provide a compatibility chart of which queries can be used with which index

关于mongodb - GeoJSON 和 MongoDB : Is it worth it to store points as GeoJSON. 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16128851/

有关mongodb - GeoJSON 和 MongoDB : Is it worth it to store points as GeoJSON. 点?的更多相关文章

  1. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  2. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  3. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  4. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  5. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

  6. Elasticsearch和MongoDB对比 - 2

    文章目录Elasticsearch和MongoDB对比关于ElasticsearchElasticsearch应用场景关于MongoDBMongoDB优点mongodb适用场景Elasticsearch和MongoDB对比Elasticsearch和MongoDB开源许可协议参考Elasticsearch和MongoDB对比关于Elasticsearch官网:https://www.elastic.co/cn/elasticsearch/Elasticistheleadingplatformforsearch-poweredsolutions.Weaccelerateresultsthatma

  7. javascript - Google Maps 3 API - 单击功能(来自 geojson)并检查它是否包含位置 - 2

    我已经在我的map上成功加载了一个geojson文件。我可以单击每个多边形来更改笔划并访问其属性。但我想知道某些点是否在每个多边形内。我已将google.maps.geometry.poly.containsLocation()用于法线多边形。有没有一种方法可以从event.feature.getGeometry()...map.data.loadGeoJson('inc-tracts.json');varfeatureStyle={strokeColor:'#000000',strokeOpacity:0.5,strokeWeight:3,}map.data.setStyle(fea

  8. javascript - 类型错误 : mongodb property insertmany is not a function - 2

    db.col.insertMany([{"_id":"tt0084726","title":"StarTrekII:TheWrathofKhan","year":1982,"type":"movie"},{"_id":"tt0796366","title":"StarTrek","year":2009,"type":"movie"},{"_id":"tt0084726","title":"StarTrekII:TheWrathofKhan","year":1982,"type":"movie"}]);OS:LinuxMint17.3RosaMongoDB:dbversionv2.6.1

  9. javascript - 如何使用 d3.js 沿 GeoJSON 路径为对象设置动画? - 2

    我正在使用D3.js从GeoJSON文件生成和呈现路径。这工作正常,但现在我想沿着那条路径为一个对象设置动画。我知道如何使用D3和标准SVG来做到这一点:创建一个过渡并设置其持续时间对于转换的每一帧,使用%complete找到沿路径的坐标将对象移动到第2步中找到的坐标这很简单。但我遇到的问题是d3.geo.path()似乎不像标准D3路径对象(例如有用的getPointAtLength()方法)那样返回任何长度或位置数据。所以我无法找到某个点的x、y坐标,比如说,沿着路径的25%。有没有办法获取这些数据?(或者是否有更好的方法,例如将d3.geo.path()转换为常规D3路径?)下面

  10. javascript - 从外部访问 Leaflet.js GeoJson 功能 - 2

    我想与L.领域之外的传单驱动map的GeoJson叠加层(多边形)进行交互,但我似乎无法访问创建的对象L..互动将包括:获取边界(我的特征)适合边界(我的特征)设置样式等等我可以看到Leaflet公开了L.GeoJSON.getFeature(),但我似乎无法从中挤出任何东西。没有文档,检查员似乎建议它不接受参数...:\这只是为了future的发展吗? 最佳答案 您可以使用getLayer通过其id获取要素。http://leafletjs.com/reference.html#layergroup-getlayervargeoj

随机推荐