Подтвердить что ты не робот

Импорт 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 с исходным форматом в файл, показанный выше?

4b9b3361

Ответ 1

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

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

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

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

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

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

НТН.

Ответ 2

Инструмент 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().

Ответ 3

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

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

  • Массив объекта с действительными позициями комы и обязательным флагом -jsonArray

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

    {obj1}
    {obj2}
    {obj3}
    

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