
다음 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({})"
나는 그것들을 실행하고 첫 번째 것이 성공하면 멈추고 싶습니다. 한 가지 방법은 배열에 넣고 명령이 성공하면 루프에서 벗어나는 것입니다. 그런데 어떻게 해야 합니까?
(이렇게 해야하는 이유는 어느 호스트가 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가 필요함). 연결 문자열에 이름을 포함하고 연결 문자열에 있는 멤버 중 하나 이상이 replicaSet
정상이면 드라이버/클라이언트가 현재 멤버를 결정합니다.
바라보다연결 문자열 URI 형식사용 가능한 옵션을 참조하세요.
또한 호출은 db.collection.remove({})
인덱스 정의를 유지하면서 개별 문서를 삭제한다는 점에 유의하세요. 삭제해야 할 컬렉션 데이터의 양이 많은 경우 db.colellection.drop()
필요한 인덱스를 호출하고 다시 만드는 것이 더 빠릅니다.
이렇게 해야 하는 이유는 어느 호스트가 PRIMARY 레플리카 세트인지 모르기 때문에 rs.status()를 실행할 권한이 없기 때문에 무차별 테스트만 할 수 있기 때문입니다.
프로그래밍 방식으로 현재 마스터 데이터베이스를 검색해야 하는 경우 다음을 사용할 수 있습니다.isMaster
주문하다. MongoDB 드라이버와 클라이언트(예: 셸)는 mongo
초기 연결 협상의 일부로 이 명령을 사용합니다. 복제 세트 구성원에 연결하면 isMaster
출력에 primary
현재 항목에 대한 추가 세부 정보가 포함됩니다.복제본 세트 상태.
MongoDB 3.6에서 이 isMaster
명령은 드라이버/클라이언트가 서버를 검색하고 인증된 연결을 협상하는 데 필요한 정보를 제공하는 데 사용되므로 인증이 필요하지 않습니다.
답변2
||
IIUC에서는 if를 사용하여 mongo
0이 아닌 오류를 반환하여 행을 연결할 수 있습니다. 에 명시된 바와 같이 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