次の3つのコマンドがあります。
mongo cdt_prod_playground --host "mngdb-cbt-stg-01:27058" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})"
mongo cdt_prod_playground --host "mngdb-cbt-stg-02:27058" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})"
mongo cdt_prod_playground --host "mngdb-cbt-stg-03:27058" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})"
私はそれらを実行し、最初のものが成功した場合は停止したいと思います。 1つの方法は、配列に配置し、コマンドが成功するとループから外れることです。しかし、どうすればいいですか?
(これを行う必要があるのは、どのホストがPRIMARYレプリカセットであるかわからないため、実行する権限がないため、無差別テストしかできないためですrs.status()
。)
答え1
どちらが現在のプライマリレプリケーションセットであるかを確認するには、すべてのレプリケーションセットメンバーに対してコマンドを試みるのではなく、コマンドラインでレプリケーションセット接続文字列を使用する必要がありますmongo
。別のコマンドラインパラメータを使用する代わりに、接続文字列にユーザー名とパスワードの資格情報を含めることを選択できます。
MongoDB 3.6.3シェルを使用した例:
mongo "mongodb://USERNAME:PASSWORD@mngdb-cbt-stg-01:27058,mngdb-cbt-stg-02:27058/DATABASE?replicaSet=cdt_prod_playground" --eval "db.${file%.*}.remove({})"
接続文字列にレプリケーションセットのすべてのメンバーを一覧表示する必要はありません。上記の例では、2つを使用しました。これは、3つのメンバーで構成されるレプリカセットからプライマリレプリカを取得する必要があるためです(プライマリレプリカを維持するには投票メンバーの3分の2が必要です)。接続文字列に名前を含め、接続文字列内の少なくとも1つのメンバーが正常な場合、replicaSet
ドライバ/クライアントは現在のメンバーを決定します。
バラより接続文字列URI形式利用可能なオプションを参照してください。
また、呼び出しはdb.collection.remove({})
インデックス定義を維持しながら個々の文書を削除することに注意してください。削除する必要があるコレクションデータの量が多い場合は、db.colellection.drop()
必要なインデックスを呼び出して再作成する方が高速です。
これは、どのホストがPRIMARYレプリカセットであるのかわからないため、rs.status()を実行する権限がないため、無差別テストのみできるためです。
プログラムで現在のマスターデータベースを検索する必要がある場合は、次のものを使用できます。isMaster
注文する。 MongoDBドライバとクライアント(シェルなど)は、mongo
初期接続ネゴシエーションの一部としてこのコマンドを使用します。レプリケーション・セット・メンバーに接続すると、isMaster
出力にprimary
現在の項目に関する追加の詳細が含まれます。レプリカセットの状態。
MongoDB 3.6では、このisMaster
コマンドはドライバ/クライアントがサーバーを検索し、認証された接続をネゴシエートするために必要な情報を提供するために使用されるため、認証は不要です。
答え2
||
IIUCでは、ifを使用してmongo
ゼロ以外のエラーを返すことで行を連結できます。に記載されているようにman bash
:
An OR list has the form
command1 || command2
command2 is executed if and only if command1 returns a non-zero exit status. The return status of AND and OR lists is the exit status of the last command executed in the list.
ここにはありませんが、mongo
例を投稿できますsucceeds.sh
。
#!/usr/bin/env sh
nonexistent-command || \
echo a || \
echo b || \
echo c
ランニング:
$ ./succeeds.sh
./succedds.sh: line 3: nonexistent-command: command not found
a
ご覧のとおり、スクリプトはa
最初の成功したコマンドであるため停止されます。
答え3
hostlist=(mngdb-cbt-stg-01:27058 mngdb-cbt-stg-02:27058 mngdb-cbt-stg-03:27058)
hostnum=0
set -u
/bin/false; while [[ 0 -ne $? ]]; do
mongo cdt_prod_playground --host "${hostlist[$hostnum]}" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})"
hostnum=$((hostnum+1))
done