使用mongoimport将JSON文件导入到MongoDB

79

我有一个名为json_file.json的文件,它看起来像这样:

[
{
    "project": "project_1",
    "coord1": 2,
    "coord2": 10,
    "status": "yes",
    "priority": 7
},
{
    "project": "project_2",
    "coord1": 2,
    "coord2": 10,
    "status": "yes",
    "priority": 7
},
{
    "project": "project_3",
    "coord1": 2,
    "coord2": 10,
    "status": "yes",
    "priority": 7
}
]

当我运行以下命令将其导入到mongodb中时:

mongoimport --db my_db --collection my_collection --file json_file.json 

我遇到了以下错误:

Failed: error unmarshaling bytes on document #0: JSON decoder out of sync - data changing underfoot?

如果我在导入命令中添加--jsonArray标志,就像这样:

imported 3 documents

如何使用上面显示的原始文件格式将JSON导入MongoDB,而不是一个带有JSON格式的文档。


3
原始的 JSON 格式映射到三个文档。 - chridam
4个回答

147

mongoimport 工具有一个选项:

--jsonArray 将输入源视为 JSON 数组

或者可以从包含与 db.collection.find() 命令结果相同数据格式的文件中导入。这是来自university.mongodb.com课件中的示例,一些内容来自于 grades.json

{ "_id" : { "$oid" : "50906d7fa3c412bb040eb577" }, "student_id" : 0, "type" : "exam", "score" : 54.6535436362647 }
{ "_id" : { "$oid" : "50906d7fa3c412bb040eb578" }, "student_id" : 0, "type" : "quiz", "score" : 31.95004496742112 }
{ "_id" : { "$oid" : "50906d7fa3c412bb040eb579" }, "student_id" : 0,       "type" : "homework", "score" : 14.8504576811645 }

正如您所看到的,没有使用数组,文档之间也没有逗号分隔符。

我最近发现,这符合JSON Lines文本格式的规范。

就像apache.spark.sql.DataFrameReader.json()方法中使用的格式一样。


顺便说一下: $ python -m json.tool --sort-keys --json-lines < data.jsonl 也可以处理这种格式。 请参阅此处的演示和详细信息。


1
谢谢,即使这是一个旧的答案,它确实解决了我的当前问题。 - Kimmo Hintikka
9
--jsonArray 标志解决了我的问题。感谢。 - JP Lew

86
也许你可以从MongoDB项目的博客中获得有关Mongo中数组的工作原理的见解:https://blog.mlab.com/2013/04/thinking-about-arrays-in-mongodb/ 我会以不同的方式呈现你的导入,要么: a) 如你所说,使用--jsonArray标志将三个不同的对象分别导入到集合中;或者 b) 将整个数组封装在一个单独的对象中,例如这样:
{
"mydata": 
    [
    {
          "project": "project_1",
          ...
          "priority": 7
    }
    ]
}

希望能有所帮助。


1
非常好。感谢您的阅读。由于此JSON仅支持D3可视化,因此数组永远不会变得很大。因此,如您所提到的,将完整数组封装在单个对象中完美地解决了问题,这也是我选择的方法。如果数据需要扩展,我将更仔细地考虑使用单独的对象来减少查询期间必须扫描的数据量。干杯。 - Cybernetic

13

今天我遇到了相反的问题,我的结论是:

如果您希望一次性插入JSON对象数组,其中每个数组条目都应被视为单独的数据库条目,则有两种语法选项:

  1. 具有有效逗号位置的对象数组和--jsonArray标志是强制性的

    [
      {obj1},
      {obj2},
      {obj3}
    ]
    
  2. 使用格式基本不正确的文件JSON格式(即在JSON对象实例之间缺少,并且没有-- jsonArray标志

  3. {obj1}
    {obj2}
    {obj3}
    
    如果你想插入一个数组(也就是将数组作为数据库的顶级元素),我认为这是不可能的,也是无效的,因为MongoDB定义支持文档作为顶级对象,然后将它们映射到JSON对象。换句话说,正如ALAN WARD所指出的那样,您必须将数组包装成JSON对象。

3

错误:

$ ./mongoimport --db bookings --collection user --file user.json

2021-06-12T18:52:13.256+0530    connected to: localhost
2021-06-12T18:52:13.261+0530    Failed: error unmarshaling bytes on document #0: JSON decoder out of sync - data changing underfoot?
2021-06-12T18:52:13.261+0530    imported 0 documents

解决方案:当您的JSON数据包含对象数组时,我们需要在导入时使用如下命令--jsonArray

$ ./mongoimport --db bookings --collection user --file user.json --jsonArray
2021-06-12T18:53:44.164+0530    connected to: localhost
2021-06-12T18:53:44.532+0530    imported 414 documents

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接