Монгоимпорт из файла json

У меня есть файл JSON, состоящий из около 2000 записей. Каждая запись, которая будет соответствовать документу в базе данных Монго, форматируется следующим образом:

{jobID:"2597401",
account:"XXXXX",
user:"YYYYY",
pkgT:{"pgi/7.2-5":{libA:["libpgc.so"],flavor:["default"]}},     
startEpoch:"1338497979",
runTime:"1022",
execType:"user:binary",
exec:"/share/home/01482/XXXXX/appker/ranger/NPB3.3.1/NPB3.3-MPI/bin/ft.D.64",
numNodes:"4",
sha1:"5a79879235aa31b6a46e73b43879428e2a175db5",
execEpoch:1336766742,
execModify: new Date("Fri May 11 15:05:42 2012"),
startTime: new Date("Thu May 31 15:59:39 2012"),
numCores:"64",
sizeT:{bss:"1881400168",text:"239574",data:"22504"}},

Каждая запись находится в одной строке в файле JSON, и единственные разрывы строк находятся в конце каждой записи. Поэтому каждая строка в документе начинается с "{jobID:"... Я пытаюсь импортировать их в базу данных mongo, используя следующую команду:

mongoimport --db dbName --collection collectionName --file fileName.json

Однако я получаю следующую ошибку:

Sat Mar  2 01:26:12 Assertion: 10340:Failure parsing JSON string near: ,execModif
0x10059f12b 0x100562d5c 0x100562e9c 0x10025eb98 0x10000e643 0x100010b60 0x10055c4cc 0x1000014b7    
0x100001454 
 0   mongoimport                         0x000000010059f12b _ZN5mongo15printStackTraceERSo + 43
 1   mongoimport                         0x0000000100562d5c _ZN5mongo11msgassertedEiPKc + 204
 2   mongoimport                         0x0000000100562e9c _ZN5mongo11msgassertedEiRKSs + 12
 3   mongoimport                         0x000000010025eb98 _ZN5mongo8fromjsonEPKcPi + 1576
 4   mongoimport                         0x000000010000e643          
                                         _ZN6Import8parseRowEPSiRN5mongo7BSONObjERi + 2739
 5   mongoimport                         0x0000000100010b60 _ZN6Import3runEv + 7376
 6   mongoimport                         0x000000010055c4cc _ZN5mongo4Tool4mainEiPPc + 5436
 7   mongoimport                         0x00000001000014b7 main + 55
 8   mongoimport                         0x0000000100001454 start + 52
Sat Mar  2 01:26:12 exception:BSON representation of supplied JSON is too large: Failure parsing    
    JSON string near: ,execModif
Sat Mar  2 01:26:12 
Sat Mar  2 01:26:12 imported 0 objects
Sat Mar  2 01:26:12 ERROR: encountered 1941 errors

Я не знаю в чем проблема. Кто-то может порекомендовать решение?

22 ответа

Решение

Мне удалось исправить ошибку, используя следующий запрос:

mongoimport --db dbName --collection collectionName --file fileName.json --jsonArray

Надеюсь, это кому-нибудь пригодится.

Попробуй это,

mongoimport --db dbName --collection collectionName <fileName.json

Пример,

mongoimport --db foo --collection myCollections < /Users/file.json
connected to: *.*.*.*
Sat Mar  2 15:01:08 imported 11 objects

Проблема из-за вашего формата даты.

Я использовал тот же JSON с измененной датой, как показано ниже, и это сработало

{jobID:"2597401",
account:"XXXXX",
user:"YYYYY",
pkgT:{"pgi/7.2-5":{libA:["libpgc.so"],flavor:["default"]}},     
startEpoch:"1338497979",
runTime:"1022",
execType:"user:binary",
exec:"/share/home/01482/XXXXX/appker/ranger/NPB3.3.1/NPB3.3-MPI/bin/ft.D.64",
numNodes:"4",
sha1:"5a79879235aa31b6a46e73b43879428e2a175db5",
execEpoch:1336766742,
execModify:{"$date" : 1343779200000},
startTime:{"$date" : 1343779200000},
numCores:"64",
sizeT:{bss:"1881400168",text:"239574",data:"22504"}}

надеюсь это поможет

Используя mongoimport вы можете добиться того же

mongoimport --db test --collection user --drop --file ~/downloads/user.json

где,

test - Database name
user - collection name
user.json - dataset file

--drop удалить коллекцию, если она уже существует.

Приставка:

mongoimport -d dbName -c collectionName dataFile.js 

Ваш синтаксис выглядит полностью правильным в:

mongoimport --db dbName --collection collectionName --file fileName.json

Убедитесь, что вы находитесь в правильной папке или укажите полный путь.

Я использовал ниже команду для экспорта БД

mongodump --db database_name --collection collection_name

и ниже у меня работала команда импортировать БД

mongorestore --db database_name path_to_bson_file

Импортировать файл JSON / CSV в MongoDB

  • Подожди подожди
  • сначала проверьте файл mongoimport.exe в папке bin(C: \ Program Files \ MongoDB \ Server \ 4.4 \ bin), если это не так, затем загрузите инструменты базы данных mongodb (https://www.mongodb.com/try/download/database-инструменты )
  • скопировать извлеченные (распаковать) файлы (внутри разархивированной корзины) в папку bin(C: \ Program Files \ MongoDB \ Server \ 4.4 \ bin)
  • скопируйте файл json в папку bin(C: \ Program Files \ MongoDB \ Server \ 4.4 \ bin)
  • Теперь откройте командную строку и измените ее каталог на bin
      cd "C:\Program Files\MongoDB\Server\4.4\bin"
  • Теперь скопируйте это в командную строку
      mongoimport -d tymongo -c test --type json --file restaurants.json
  • где d- база данных (имя базы данных tymongo), c-collection(имя тестовой коллекции)

ДЛЯ CSV-ФАЙЛА

       mongoimport -d tymongo -c test --type csv --file database2.csv --headerline

В Windows вы можете использовать командную строку Prompcmd cmd, в Ubuntu вы можете использовать свой terminal введя следующую команду:

mongoimport  -d  your_database_name  -c  your_collection_name  /path_to_json_file/json_file_name.json

затем, когда вы откроете свою оболочку mongo, вы найдете проверить имя_базы_данных при выполнении этой команды:

show databases

Запустите команду импорта в другом терминале. (не внутри оболочки монго.)

mongoimport --db test --collection user --drop --file ~/downloads/user.json

Эта команда работает там, где коллекция не указана.

mongoimport --db zips "\MongoDB 2.6 Standard\mongodb\zips.json"

Оболочка Монго после выполнения команды

connected to: 127.0.0.1
no collection specified!
using filename 'zips' as collection.
2014-09-16T13:56:07.147-0400 check 9 29353
2014-09-16T13:56:07.148-0400 imported 29353 objects

Решение:-

mongoimport --db databaseName --collection tableName --file filepath.json

Пример:-

Поместите свой файл в папку администратора: -

C:\Users\admin\tourdb\places.json

Запустите эту команду на своем терминале: -

mongoimport --db tourdb --collection places --file ~/tourdb/places.json

Выход:-

admin@admin-PC MINGW64 /
$ mongoimport --db tourdb --collection places --file ~/tourdb/places.json
2019-08-26T14:30:09.350+0530 connected to: localhost
2019-08-26T14:30:09.447+0530 imported 10 documents

Для получения дополнительной ссылки

это будет работать:

$ mongoimport --db databaseName --collection имя коллекции --file filePath / jsonFile.json 

2021-01-09T11:13:57.410+0530 подключен к: mongodb: // localhost / 2021-01-09T11:13:58.176+0530 1 документ (ы) успешно импортирован. 0 документов не удалось импортировать.

Выше я поделился запросом вместе с его ответом

mongoimport -d < имя_базы_данных > -c < имя_коллекции > --file <c:\users\test.json> --jsonArray

Это работает со мной, когда db с usrname и паролем

mongoimport --db YOUR_DB --collection MyCollection --file /your_path/my_json_file.json -u my_user -p my_pass

db без пароля пользователя удалите -u my_user -p my_pass

Мой образец json

{ 
    "_id" : ObjectId("5d11c815eb946a412ecd677d"), 
    "empid" : NumberInt(1), 
    "name" : "Rahul"
}
{ 
    "_id" : ObjectId("5d11c815eb946a412ecd677e"), 
    "empid" : NumberInt(2), 
    "name" : "Rahul"
}

Немного поздно для вероятного ответа, может помочь новым людям. Если у вас несколько экземпляров базы данных:

mongoimport --host <host_name>:<host_port> --db <database_name> --collection <collection_name>  --file <path_to_dump_file> -u <my_user> -p <my_pass>

Если требуются учетные данные, в противном случае удалите этот параметр.

  1. Просто скопируйте путь к файлу json, например, "C:\people.json"
  2. перейдите в C:\Program Files\MongoDB\Server\4.2\bin
  3. откройте cmd в этой папке bin mongodb и запустите эту команду

mongoimport --jsonArray --db dbname- collection collectionName- filePath

пример mongoimport --jsonArray --db learnmongo --collection people --file C:\persons.json

Я попробовал что-то вроде этого, и это на самом деле работает:

mongoimport --db dbName --file D:\KKK\NNN\100YWeatherSmall.data.json

Было дано количество ответов, хотя я хотел бы дать свою команду. Раньше часто. Это может кому-то помочь.

mongoimport original.json -d databaseName -c yourcollectionName --jsonArray --drop
  1. импортируйте данные массива json в ATLAS на свой локальный ноутбук https://www.mongodb.com/docs/atlas/import/mongoimport/
      mongoimport --uri "mongodb+srv://<user>:<password>@cluster0.elddaddy.mongodb.net/test?retryWrites=true&w=majority&ssl=true" --collection Providers --drop --file /Users/Documents/data2.json --jsonArray

Эта команда импортирует данные из файла data2.json в коллекцию с именем «Поставщики» в базе данных MongoDB, расположенную по URI кластера0.dl79aky.mongodb.net.

Опция --drop используется для удаления существующей коллекции, если она существует.

Опция --jsonArray указывает, что входной файл представляет собой массив JSON, а не один объект JSON. Это позволяет нам импортировать массив документов в пакетном режиме.

Параметр --uri указывает URI для подключения к базе данных, который включает учетные данные пользователя, имя базы данных и параметры подключения.

Вот разбивка URI:

mongodb+srv://: указывает, что это строка подключения для кластера MongoDB Atlas, использующего DNS-запись SRV. :@: указывает имя пользователя и пароль пользователя, подключающегося к базе данных. имя кластера MongoDB Atlas, к которому вы хотите подключиться

/test: имя базы данных в кластере, к которой вы хотите подключиться.

?retryWrites=true&w=majority: указывает параметры записи для соединения. retryWrites=true указывает, что драйвер должен повторить попытку записи в случае неудачи, а w=majority указывает, что операция записи должна ждать, пока большинство узлов подтвердит запись, прежде чем вернуться.

&ssl=true: указывает, что соединение должно использовать шифрование SSL/TLS.

  1. проверьте, что ваши данные должны быть массивом json
      [
  {
    "name": "John",
    "age": 30,
    "email": "john@example.com"
  },
  {
    "name": "Jane",
    "age": 25,
    "email": "jane@example.com"
  },
  {
    "name": "Bob",
    "age": 40,
    "email": "bob@example.com"
  }
]

Время от времени у меня возникали странные ошибки JSON. Лучший способ справиться с ними - запустить хороший валидатор JSON, чтобы убедиться в отсутствии проблем с синтаксисом. Я обычно использую https://jsonlint.com/.

Я также предпочитаю использовать специализированный инструмент администратора MongoDB, такой как Navicat для MongoDB. Хотя это не бесплатный продукт, он стоит каждого пенни. Он имеет отличный Мастер импорта, который поддерживает передачи.txt, .csv, .json, .excel и даже DB в DB. Есть экраны для установки разделителей, форматов даты, кодировки символов, сопоставления полей, вы называете это. Вы также можете оставить сообщение об ошибке или отменить.

Я использовал его для импорта огромных наборов данных и нашел, что это относительно простой процесс.

Во всяком случае, я уверен, что эти идеи добьются цели!

С наилучшими пожеланиями.

Если вы попытаетесь экспортировать эту тестовую коллекцию:

> db.test.find()
{ "_id" : ObjectId("5131c2bbfcb94ddb2549d501"), "field" : "Sat Mar 02 2013 13:13:31 GMT+0400"}
{"_id" : ObjectId("5131c2d8fcb94ddb2549d502"), "field" : ISODate("2012-05-31T11:59:39Z")}

с mongoexport (первая дата, созданная с Date(...) а второй создан с new Date(...) (если использовать ISODate(...) будет таким же, как во второй строке)) поэтому вывод mongoexport будет выглядеть так:

{ "_id" : { "$oid" : "5131c2bbfcb94ddb2549d501" }, "field" : "Sat Mar 02 2013 13:13:31 GMT+0400" }
{ "_id" : { "$oid" : "5131c2d8fcb94ddb2549d502" }, "field" : { "$date" : 1338465579000 } }

Таким образом, вы должны использовать те же обозначения, потому что строгий JSON не имеет типа Date( <date> ),

Также ваш JSON недопустим: все имена полей должны быть заключены в двойные кавычки, но mongoimport работает без них.

Вы можете найти дополнительную информацию в документации mongodb и здесь.

Это должно работать внутри mongoshell

mongoimport -d databaseName -c collectionName --drop fileName.json

если вы не запустили оболочку в нужном каталоге, вы должны указать файл вместе с его путем.

Другие вопросы по тегам