使用mongoimport将json从文件导入mongodb

Cyb*_*tic 66 mongodb

我有这样的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
}
]
Run Code Online (Sandbox Code Playgroud)

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

mongoimport --db my_db --collection my_collection --file json_file.json 
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Failed: error unmarshaling bytes on document #0: JSON decoder out of sync - data changing underfoot?
Run Code Online (Sandbox Code Playgroud)

如果我将--jsonArray标志添加到我导入的命令中,如下所示:

imported 3 documents
Run Code Online (Sandbox Code Playgroud)

而不是原始文件中显示的具有json格式的一个文档.

如何在上面显示的文件中以原始格式将json导入mongodb?

Ale*_*sev 112

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 }
Run Code Online (Sandbox Code Playgroud)

如您所见, 文档之间
没有使用数组也
没有逗号分隔符.

我最近发现,
这符合the JSON Lines text格式.
就像在apache.spark.sql.DataFrameReader.json()方法中使用的一样.

  • `--jsonArray`标志为我做了.谢谢. (4认同)

小智 77

也许来自MongoDB项目博客的以下参考可以帮助您深入了解数组在Mongo中的工作方式:

https://blog.mlab.com/2013/04/thinking-about-arrays-in-mongodb/

否则我会构建你的导入框架,并且:

a)使用--jsonArray标志将三个不同的对象分别导入到集合中; 要么

b)将完整数组封装在单个对象中,例如以这种方式:

{
"mydata": 
    [
    {
          "project": "project_1",
          ...
          "priority": 7
    }
    ]
}
Run Code Online (Sandbox Code Playgroud)

HTH.

  • 谢谢,只需要'--jsonArray':) (2认同)

Tom*_*mas 9

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

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

  1. 具有有效昏迷位置的对象数组和--jsonArray标志必须

    [
      {obj1},
      {obj2},
      {obj3}
    ]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用基本上不正确的JSON格式的文件(即,在JSON对象实例和没有--jsonArray标志之间丢失

    {obj1}
    {obj2}
    {obj3}
    
    Run Code Online (Sandbox Code Playgroud)

如果你只希望插入一个数组(即数组作为数据库的顶级公民),我认为这是不可能的,也是无效的,因为根据定义,mongoDB支持将文档作为顶级对象,然后映射到JSON对象.换句话说,您必须像ALAN WARD指出的那样将数组包装到JSON对象中.