私は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
別の1行のソリューション(jsonファイルがあるフォルダーにいると想定):
ls | sed 's/.json$//' | xargs -I{} mongoimport -d DATABASE_NAME -c {} {}.json
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"
1行のソリューション:
for /F %i in ('dir /b c:\files\*.json') do mongoimport.exe /d db /c files /file c:\file\%i
ここのソリューションを使用して、シェル関数をbashプロファイルに追加し、これをすばやく実行しました。
私の例は、各コレクションをコレクション名と_.metadata.json
_拡張子を持つファイルとして出力するmongoエクスポートに依存しています。
function mimport() { for filename in *; do collection="${filename%.metadata.json}"; mongoimport --db $1 --collection $collection --file $filename; done }
コマンドにDB名を渡して、エクスポートファイルのパスで使用します...
_mimport my_db
_
すべてのコレクションをローカルホストのDBにロードします。
Linuxのターミナルのみを使用して多くのコレクションを効率的にインポートする方法を示します(Macでも機能します)。
すべてのjsonファイルが同じフォルダーにある必要があり、ファイルの名前はデータベースにインポートされるコレクションでなければなりません。
それでは、始めましょう。jsonファイルを含むフォルダーを開きます。 _<DATABASE>
_をデータベース名に置き換え、次の行を実行します。
for collection in $(ls | cut -d'.' -f1); do mongoimport --db <DATABASE> --collection ${collection} --file ${collection}.json; done
しかし、そこで何が起こっているのですか?
まず、括弧が最初に実行されることを覚えておく必要があります。この場合、各ファイルの名前だけを取得して(拡張子を削除して)すべてのファイルのリストを作成します。
次に、すべてのリストがコレクションと呼ばれるローカル変数の「for」ループに追加されます(この変数の名前は何でもかまいません)
3番目に、「do」はインポート行を実行します(*)
最後に「完了」して、ループを終了します。
(*)インポート行は、データベース名「--db」、コレクション名「--collection」、およびファイル名「--file」を必要とする「mongoimport」で構成されています。これらの要件は、「for」のもので作成された変数「$ collection」によって満たされています
私は誰かを助けたいと思います!がんばれ :)
新しい機能かどうかはわかりませんが、mongoimport
が実際にstdinから読み取れるようになりました。したがって、複数のJSONファイルをインポートするためにできることは、
cat *.json | mongoimport --uri "mongdb://user:password@Host/db?option=value" --collection example
私はmongodb-tools v4.2.0を使用しています。
[〜#〜]更新[〜#〜]
mongodbimport
は大量のメモリを消費する可能性があり、システムOOMによってプログラムが強制終了される可能性があります。私のマシンには32GB RAMがあり、RAM disk。
比較的大きなジョブをバッチに分割するには:
#!/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:pass@Host/db" --collection=examples -j8 #--mode=upsert --upsertFields=id1
json_files=()
fi
done