Ответ 1
Вы всегда можете написать сценарии оболочки.
colls=( mycoll1 mycoll2 mycoll5 )
for c in ${colls[@]}
do
mongoimport -d mydb -c $c.json
done
Я новичок в mongodb
и хочу знать об импорте файла json
с одного сервера на другой. Я попробовал следующую команду mongoimport -d test -c bik check.json
, и она отлично работает для меня. Теперь я хочу знать, когда есть несколько файлов json
, как я могу их импортировать за один раз. Я не мог найти какой-либо связанный документ, где это написано, это невозможно. Пожалуйста, помогите мне, это возможно и как
Вы всегда можете написать сценарии оболочки.
colls=( mycoll1 mycoll2 mycoll5 )
for c in ${colls[@]}
do
mongoimport -d mydb -c $c.json
done
Я придумал более элегантный способ автоматического импорта всех коллекций:
ls -1 *.json | sed 's/.json$//' | while read col; do
mongoimport -d db_name -c $col < $col.json;
done
Я надеюсь, что это будет полезно.
Пакетная версия Windows:
@echo off
for %%f in (*.json) do (
"mongoimport.exe" --jsonArray --db databasename --collection collectioname --file %%~nf.json
)
Вы также можете сделать это:
for filename in *; do mongoimport --db <Database> --collection <Collection Name> --file $filename; done
Это работало для меня в MAC OS X
find . -regex '.*/[^/]*.json' | xargs -L 1 mongoimport --db DB_NAME -u USER_NAME -p PASSWORD --collection COLLECTION_NAME --file
Для файла windows bat. Это было бы лучше, если у вас есть список json файлов в папке. и имя коллекции соответствует имени в файлах
@echo off
for %%f in (*.json) do (
"mongoimport.exe" --db databasename --collection %%~nf --drop --file %%f
)
pause
Другое однострочное решение (если вы находитесь в папке, где находятся json файлы):
ls | sed 's/.json$//' | xargs -I{} mongoimport -d DATABASE_NAME -c {} {}.json
Я собираюсь показать, как эффективно импортировать множество коллекций, используя только терминал Linux (он также работает на Mac).
У вас должны быть все json файлы в одной папке, а имя файла должно быть коллекцией, которая будет импортирована в вашу базу данных.
Итак, давайте начнем, откройте папку, содержащую ваши json файлы. Замените <DATABASE>
на ваше имя базы данных, затем выполните следующую строку:
for collection in $(ls | cut -d'.' -f1); do mongoimport --db <DATABASE> --collection ${collection} --file ${collection}.json; done
Но что там происходит?
Прежде всего, вы должны иметь в виду, что скобки будут выполняться первыми. В этом случае он создает список всех файлов, получающих только имя каждого файла (удаление его расширения).
Во-вторых, весь список будет добавлен в цикл "for" в локальной переменной, называемой collection (это имя переменной может быть любым, что вы хотите)
В-третьих, "do" выполняет строку импорта (*)
Наконец, "сделано", завершите цикл.
(*) Линия импорта состоит из "mongoimport", для которого требуется имя базы данных "--db", имя коллекции "--collection" и имя файла "--file". Эти требования были заполнены переменной "$ collection", созданной на основе "для"
Надеюсь, кто-то помог! Удачи, ребята:)
Я использовал решения здесь, чтобы добавить функцию оболочки в мой профиль bash, чтобы сделать это быстро.
Мой пример зависит от экспорта mongo, выводящего каждую коллекцию в виде файла с именем коллекции и расширением .metadata.json
.
function mimport() { for filename in *; do collection="${filename%.metadata.json}"; mongoimport --db $1 --collection $collection --file $filename; done }
Используйте путь к файлам экспорта, передавая имя базы данных в команду...
mimport my_db
Будут загружены все коллекции в БД на localhost.
Linux:
> cat one.json two.json > three.json
> mongoimport --db foo --collection baz --file three.json"
Или все файлы в папке:
> cat *.json > big.json
> mongoimport --db foo --collection baz --file "big.json"
Одноканальное решение:
for/F %i in ('dir/bc:\files\*.json') do mongoimport.exe/d db/c files/file c:\file\%i
Не уверен, что это новая функция, но mongoimport
теперь может читать со стандартного ввода. Таким образом, можно импортировать несколько файлов JSON так же просто, как
cat *.json | mongoimport --uri "mongdb://user:[email protected]/db?option=value" --collection example
Я использую mongodb-tools v4.2.0, кстати.
UPDATE
mongodbimport
потенциально может потреблять большой объем памяти, что может привести к уничтожению программы системой OOM. Моя машина получила 32 ГБ оперативной памяти, и это происходило последовательно, когда я пытался импортировать ~ 10 ГБ данных, которые хранятся на RAM-диске.
Чтобы разделить относительно большую работу на партии:
#!/usr/bin/env bash
declare -a json_files=()
for f in *.json; do
json_files+="$f"
if [[ "${#json_files[@]}" -ge 1000 ]]; then
cat "${json_files[@]}" | mongoimport --uri="mongodb://user:[email protected]/db" --collection=examples -j8 #--mode=upsert --upsertFields=id1
json_files=()
fi
done