명령을 계속 실행하고 첫 번째 명령이 0으로 종료되면 중지합니다.

명령을 계속 실행하고 첫 번째 명령이 0으로 종료되면 중지합니다.

다음 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를 사용하여 mongo0이 아닌 오류를 반환하여 행을 연결할 수 있습니다. 에 명시된 바와 같이 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

관련 정보