あるサーバーから別のサーバーにファイルをインポートするのは初めてでmongodb
、知りたいです。json
次のコマンドを試しましたが、mongoimport -d test -c bik check.json
問題なく動作します。json
複数のファイルがある場合、一度にすべてをインポートするにはどうすればよいか知りたいです。私はそれが書かれている関連文書を見つけることができませんでしたこれは不可能です。これが可能であり、どのように私を助けてください
13 に答える
すべてのコレクションを自動的にインポートするためのより洗練された方法を思いつきました。
ls -1 *.json | sed 's/.json$//' | while read col; do
mongoimport -d db_name -c $col < $col.json;
done
これがお役に立てば幸いです。
いつでもいくつかのシェルスクリプトを書くことができます。
colls=( mycoll1 mycoll2 mycoll5 )
for c in ${colls[@]}
do
mongoimport -d mydb -c $c.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
これはMACOSXで私のために働いた
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"
ワンラインソリューション:
for /F %i in ('dir /b c:\files\*.json') do mongoimport.exe /d db /c files /file c:\file\%i
これが新機能かどうかはわかりませんが、mongoimport
実際にはstdinから読み取ることができます。したがって、複数のJSONファイルをインポートするためにできることは次のように簡単です。
cat *.json | mongoimport --uri "mongdb://user:password@host/db?option=value" --collection example
私はmongodb-toolsv4.2.0btwを使用しています。
アップデート
mongodbimport
大量のメモリを消費する可能性があり、システムOOMによってプログラムが強制終了される可能性があります。私のマシンには32GBのRAMが搭載されており、RAMディスクに保存されている最大10GBのデータをインポートしようとすると、これが一貫して発生しました。
比較的大きなジョブをバッチに分割するには:
#!/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
Linuxの端末のみを使用して多くのコレクションを効率的にインポートする方法を示します(Macでも機能します)。
すべてのjsonファイルが同じフォルダーにある必要があり、ファイルの名前はデータベースにインポートされるコレクションである必要があります。
それでは、始めましょう、jsonファイルを含むフォルダーを開きます。をデータベース名に置き換えて<DATABASE>
から、次の行を実行します。
for collection in $(ls | cut -d'.' -f1); do mongoimport --db <DATABASE> --collection ${collection} --file ${collection}.json; done
しかし、そこで何が起こっているのでしょうか?
まず、括弧が最初に実行されることを覚えておく必要があります。この場合、すべてのファイルのリストを作成し、各ファイルの名前だけを取得します(拡張子を削除します)。
次に、すべてのリストがコレクションと呼ばれるローカル変数の「for」ループに追加されます(この変数の名前は任意の名前にすることができます)
第三に、「do」はインポート行を実行します(*)
最後に「完了」し、ループを終了します。
(*)インポート行は、データベース名「--db」、コレクション名「--collection」、およびファイル名「--file」を必要とする「mongoimport」で構成されます。これらの要件は、「for」のもので作成された変数「$collection」によって満たされています。
私は誰かを助けたことを願っています!がんばれ :)
ここでのソリューションを使用して、これをすばやく行うためにシェル関数をbashプロファイルに追加しました。
私の例は、各コレクションをコレクション名と拡張子を持つファイルとして出力するmongoエクスポートに依存しています.metadata.json
。
function mimport() {
for filename in *; do
collection="${filename%.metadata.json}";
mongoimport --db $1 --collection $collection --file $filename;
done
}
エクスポートファイルのパスで使用し、DB名をコマンドに渡します...
mimport my_db
すべてのコレクションをローカルホストのDBにロードします。
Python:
from pathlib import Path
import subprocess
jsons_folder = "./out/"
mongodb_host = "172.22.0.3"
mongodb_port = "27017"
mongodb_user = "root"
mongodb_password = "1234"
for f in Path(jsons_folder).glob("*.json"):
cmd = [
"mongoimport", "-h", mongodb_host, "-p", mongodb_port, "--authenticationDatabase", "admin",
"-u", mongodb_user, "-p", mongodb_password,
"--db", "callscoring", "--collection", "scoring_result_entry", str(f.absolute())
]
subprocess.run(cmd)