使用mongoimport将json从文件导入到mongodb


72

我有这样的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格式的一个文档。

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


3
原始json格式映射到三个文档。
chridam

Answers:


83

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

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

否则,我将框定您的导入,或者:

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

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

{
"mydata": 
    [
    {
          "project": "project_1",
          ...
          "priority": 7
    }
    ]
}

HTH。


1
优秀的。谢谢您的阅读。由于此json仅支持D3视觉效果,因此数组永远不会变大。因此,就像您提到的那样,将整个数组简单地封装在一个对象中就可以很好地工作,这是我选择要做的。如果数据需要扩展,我将更仔细地研究使用单独的对象来减少在查询过程中必须扫过的数据量。干杯。
控制论2015年

136

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 }

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

我发现最近这符合the JSON Lines text格式。

就像一种apache.spark.sql.DataFrameReader.json()方法。


1
谢谢,尽管有一个旧答案,它确实解决了我当前的问题
Kimmo Hintikka

5
--jsonArray标志为我做到了。谢谢。
JP Lew

13

我今天面临相反的问题,我的结论是:

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

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

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

    {obj1}
    {obj2}
    {obj3}
    

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.