【问题标题】:How to import Geojson file to MongoDB如何将 Geojson 文件导入 MongoDB
【发布时间】:2014-03-28 13:21:29
【问题描述】:

由于 Geojson 是实际的 json,我想我可以使用 mongoimport 将数据从 .geojson 文件加载到我的 MongoDB 数据库中。

但我收到以下错误:

exception:BSON representation of supplied JSON is too large: code FailedToParse: FailedToParse: Expecting '{': offset:0

文件大小为 25MB,这是其中的一个片段:

{
"type": "FeatureCollection",
"features": [
{
    "type": "Feature",
    "id": "node/2661561690",
    "properties": {
        "timestamp": "2014-02-08T17:58:24Z",
        "version": "1",
        "changeset": "20451306",
        "user": "Schandlers",
        "uid": "51690",
        "natural": "tree",
        "id": "node/2661561690"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [
            -66.9162255,
            10.5056439
        ]
    }
},
// ... Omitted data
{
    "type": "Feature",
    "id": "node/2664472516",
    "properties": {
        "timestamp": "2014-02-10T04:27:30Z",
        "version": "2",
        "changeset": "20477473",
        "user": "albertoq",
        "uid": "527105",
        "name": "Distribuidora Brithijos (Aceites)",
        "shop": "car_parts",
        "id": "node/2664472516"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [
            -66.9388903,
            10.4833647
        ]
    }
}
]
}

【问题讨论】:

  • 需要更多信息:文件有多大?文件中的每条记录有多大?你能分割你运行的命令来得到那个错误吗?如果我没记错的话,mongoimport 期望每行一个 json 对象。
  • @RobMoore 文件大小为 25MB。我跑的是mongoimport --db driversec --collection geomaps --file map.geojson。该文件每行没有一个 json 对象,我会说它打印得很漂亮,那可能是问题所在...您是否推荐任何工具来正确地为 mongoimport 调整文件
  • @RobMoore 我编辑了问题以显示我正在尝试导入的文件片段
  • 它看起来像 1 个大文件。 MongoDB 的文档大小限制为 16MB。这与您看到的错误相符。您希望它作为 1 个文档加载还是将每个“功能”加载为单独的文档?无论哪种方式,您都需要写一些东西来分解文档。

标签: mongodb geospatial geojson


【解决方案1】:

此 Python 脚本旨在一步将 GeoJSON 文件导入 MongoDB:https://github.com/rtbigdata/geojson-mongo-import.py

【讨论】:

    【解决方案2】:

    如果问题是您的文档集大小优于 16Mb,您可以使用 batchSize 选项,该选项设置批处理中的文档数。例如:

    mongoimport -d mydb -c mycol data.json -j 4 --batchSize=100
    

    注意-j 选项,它有助于通过使用多个工作人员来增加数据库的输出。

    奇怪的是,batchSize 选项没有使用 'mongoimport' 的 '--help' 选项记录,请看图!

    【讨论】:

      【解决方案3】:

      ParoX 的想法很好用,但是有 16MB 的限制。

      mongodb document

      --jsonArray 接受用单个 JSON 数组中的多个 MongoDB 文档表示的数据的导入。仅限于 16 MB 的导入或 更小。

      如果文件大小大于 16MB,你可以这样做

      jq --compact-output ".features[]" input.geojson > output.geojson

      这将为一个对象提供准确的一行,末尾没有逗号。

      {.....}
      {.......}
      {...}
      
      {"type":"Feature","geometry":{"type":"Point","coordinates":[-80.87088507656375,35.21515162500578]},"properties":{"name":"ABBOTT NEIGHBORHOOD PARK","address":"1300  SPRUCE ST"}}
      {"type":"Feature","geometry":{"type":"Point","coordinates":[-80.83775386582222,35.24980190252168]},"properties":{"name":"DOUBLE OAKS CENTER","address":"1326 WOODWARD AV"}}
      {"type":"Feature","geometry":{"type":"Point","coordinates":[-80.83827000459532,35.25674709224663]},"properties":{"name":"DOUBLE OAKS NEIGHBORHOOD PARK","address":"2605  DOUBLE OAKS RD"}}
      {"type":"Feature","geometry":{"type":"Point","coordinates":[-80.83697759172735,35.25751734669229]},"properties":{"name":"DOUBLE OAKS POOL","address":"1200 NEWLAND RD"}}
      {"type":"Feature","geometry":{"type":"Point","coordinates":[-80.81647652154736,35.40148708491418]},"properties":{"name":"DAVID B. WAYMER FLYING REGIONAL PARK","address":"15401 HOLBROOKS RD"}}
      {"type":"Feature","geometry":{"type":"Point","coordinates":[-80.83556459443902,35.39917224760999]},"properties":{"name":"DAVID B. WAYMER COMMUNITY PARK","address":"302 HOLBROOKS RD"}}
      {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-80.72487831115721,35.26545403190955],[-80.72135925292969,35.26727607954368],[-80.71517944335938,35.26769654625573],[-80.7125186920166,35.27035945142482],[-80.70857048034668,35.268257165144064],[-80.70479393005371,35.268397319259996],[-80.70324897766113,35.26503355355979],[-80.71088790893555,35.2553619492954],[-80.71681022644043,35.2553619492954],[-80.7150936126709,35.26054831539319],[-80.71869850158691,35.26026797976481],[-80.72032928466797,35.26061839914875],[-80.72264671325684,35.26033806376283],[-80.72487831115721,35.26545403190955]]]},"properties":{"name":"Plaza Road Park"}}
      

      mongoimport --db dbname -c collectionname --file "output.geojson" --jsonArray

      【讨论】:

        【解决方案4】:

        首先,为了验证您的 GeoJSON 文件是否准确,您可以使用GeojsonlintQGIS 等。

        之后,要将您的数据导入您的集合,请使用Mongoimport

        mongoimport --db MY_DATABASE_NAME -c MY_COLLECTION_NAME --type json --file "MY_GEOJSON_FILENAME"

        将上面的 3 个变量替换为您的有效名称。显然,请确保您的当前目录包含该文件。

        【讨论】:

          【解决方案5】:

          下载jq(类似于 sed 的程序,但用于 JSON)

          然后运行:

          jq --compact-output ".features" input.geojson > output.geojson

          然后

          mongoimport --db dbname -c collectionname --file "output.geojson" --jsonArray

          【讨论】:

          • 最好有一个可以自动化的过程,而不是被告知您必须在文本编辑器中进行的特定调整(在文件的巨大重量下嘎吱作响)。感谢您的建议
          • 可以直接通过管道传输结果,而无需使用临时文件:jq --compact-output ".features" input.geojson | mongoimport --db dbname -c collectionname --jsonArray
          【解决方案6】:

          现在您拥有一系列功能。 MongoDB 会将其视为一个文档。尝试从 geojson 的开头删除以下内容:

          {
          "type": "FeatureCollection",
          "features": [
          

          另外,从您的 geojson 末尾删除以下内容:

          ]
          }
          

          编辑 - 此外,mongo 期望每行一个文档。因此,请确保您唯一的 \n 在文档之间!例如

          ...    
          },\n
              {
                  "type": "Feature",
                  "id": "node/2664472516",
          ...
          

          【讨论】:

            猜你喜欢
            • 2018-09-20
            • 2020-06-13
            • 2015-10-13
            • 2013-07-25
            • 2018-12-25
            • 1970-01-01
            • 1970-01-01
            • 2014-10-04
            • 2018-09-05
            相关资源
            最近更新 更多