web-dev-qa-db-ja.com

mongoimportを使用して複数のjsonファイルをインポートする

私はmongodbを初めて使用し、あるサーバーから別のサーバーにjsonファイルをインポートする方法について知りたいです。私は次のコマンドを試しましたmongoimport -d test -c bik check.jsonそしてそれは私にとってはうまくいきます。次に、複数のjsonファイルがある場合に、一度にすべてのファイルをインポートする方法を知りたい。これが書かれている関連文書を見つけることができませんでした。これは不可能です。これが可能な方法と方法を教えてください

24
user850234

シェルスクリプトはいつでも作成できます。

colls=( mycoll1 mycoll2 mycoll5 )

for c in ${colls[@]}
do
  mongoimport -d mydb -c $c.json
done
23

すべてのコレクションを自動的にインポートする、より洗練された方法を思いつきました。

ls -1 *.json | sed 's/.json$//' | while read col; do 
    mongoimport -d db_name -c $col < $col.json; 
done

これがお役に立てば幸いです。

25
romaninsh

Windowsバッチバージョン:

@echo off
for %%f in (*.json) do (
    "mongoimport.exe" --jsonArray --db databasename --collection collectioname --file %%~nf.json
)
15
Tomi Kokkonen

あなたもこの方法でそれを行うことができます:

for filename in *; do mongoimport --db <Database> --collection <Collection Name> --file $filename; done
9
helpdoc

これはMAC OS Xで私のために働きました

find . -regex '.*/[^/]*.json' | xargs -L 1 mongoimport --db DB_NAME -u USER_NAME -p PASSWORD --collection COLLECTION_NAME  --file
4

windows batファイルの場合。フォルダーにjsonファイルのリストがある場合、これははるかに優れています。コレクション名はファイル内の名前と一致します

@echo off
for %%f in (*.json) do (
    "mongoimport.exe" --db databasename --collection %%~nf --drop --file %%f
)
pause
3
Eduardo

別の1行のソリューション(jsonファイルがあるフォルダーにいると想定):

ls | sed 's/.json$//' | xargs -I{} mongoimport -d DATABASE_NAME -c {} {}.json
2
Sam Kenny

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

1
user854301

ここのソリューションを使用して、シェル関数を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にロードします。

1
Teeks

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」によって満たされています

私は誰かを助けたいと思います!がんばれ :)

1
Luan Rodrigues

新しい機能かどうかはわかりませんが、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
0
Frederick Zhang