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