Импорт json из файла в mongodb с помощью mongoimport


у меня есть 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 55

3 ответа:

возможно, следующая ссылка из блога проекта MongoDB может помочь вам получить представление о том, как работают массивы в Mongo:

http://blog.mongolab.com/2013/04/thinking-about-arrays-in-mongodb/

Я бы сделал ваш импорт иначе, и либо:

a) импортируйте три разных объекта отдельно в коллекцию, как вы говорите, используя флаг --jsonArray; или

b) инкапсулировать весь массив в пределах одного объекта, например, таким образом:

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

HTH.

The mongoimport инструмент имеет опцию:
--jsonArray обработайте источник входного сигнала как массив JSON
Или можно импортировать из файла
содержит тот же формат данных, что и
результат .
Вот пример из university.mongodb.com courseware
некоторое содержание от 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() метод .

я столкнулся с противоположной проблемой сегодня, мой вывод будет:

Если вы хотите вставить массив объектов JSON сразу, где каждая запись массива должна рассматриваться как отдельная запись dtabase, у вас есть два варианта синтаксиса:

  1. массив объектов с допустимыми позициями комы & -- jsonarray флаг обязателен

    [
      {obj1},
      {obj2},
      {obj3}
    ]
    
  2. использовать файл с в основном неправильным форматированием JSON (т. е. отсутствует , между экземплярами объектов JSON & без флага --jsonArray

    {obj1}
    {obj2}
    {obj3}
    

Если вы хотите вставить только массив (т. е. массив как гражданин верхнего уровня вашей базы данных), я думаю, что это невозможно и недопустимо, потому что mongoDB по определению поддерживает документы как объекты верхнего уровня, которые впоследствии сопоставляются с объектами JSON. Другими словами, вы должны обернуть свой массив в объект JSON, как указал Алан Уорд.