mongosh에선 sh. 로 시작하는, MongoDB 관리 명령어를 좀 더 편하게 사용할 수 있는 js 객체가 있음.

 

예를 들어 chunk를 이동시키는 moveChunk의 명령어의 경우,

제대로 된 정식 실행방법은 아래와 같지만,

https://www.mongodb.com/docs/manual/reference/command/moveChunk/

db.adminCommand({
    moveChunk: <namespace>,
    find: <query>,
    to: <string>,
    forceJumbo: <boolean>,
    _secondaryThrottle: <boolean>,
    writeConcern: <document>,
    _waitForDelete: <boolean>
})

 

sh 를 이용하면 아래처럼 간단해짐.

sh.moveChunk(<namespace>, <query>, <destination>)

 

 

여기서 문제가 뭐냐면 mongosh shell 상에서 sh. 를 이용해서 간단하게 처리하던걸 각종 언어의 드라이버로 하려면 방법이 없으므로,

db.adminCommand() 혹은 db.runCommand()를 이용하는 방법을 써야하는데,

대부분의 sh. 관련 문서에는 동일한 정식 명령어에 대한 링크가 걸려 있지만 sh.isBalancerRunning() 같이 간혹 없는 경우도 있음.

 

https://www.mongodb.com/docs/manual/reference/method/sh.isBalancerRunning/

(드라이버 문서에서 찾아보라고 나와 있음)

 

근데 sh.enableBalacing(), sh.disableBalancing() 같은 건 아예 그런 안내도 없음.

 

그래서 이걸 어디서 찾아보나 싶어서 MongoDB 소스코드를 뒤져보니 sh. 관련 명령어가 정의되어 있는 js 파일이 있었음.

https://github.com/mongodb/mongo/blob/master/src/mongo/shell/utils_sh.js

 

궁금한 명령어는 여기서 함수 내부구현을 보고 확인할 수 있음.

참고로 sh.isBalancerRunning()은 아래와 같고, 결국은 configDB.adminCommand({ balancerStatus: 1 }) 이었음.

sh.isBalancerRunning = function(configDB) {
    if (configDB === undefined)
        configDB = sh._getConfigDB();
 
    var result = configDB.adminCommand({balancerStatus: 1});
    return assert.commandWorked(result).inBalancerRound;
};
 
// 실제로 mongosh에서 아래처럼 해보면 동일한 결과를 얻을 수 있음
db.getSiblingDB('config').adminCommand({balancerStatus: 1})

 

sh. 명령어 중 원본 command가 문서에 없는 것들을 굳이 드라이버로 구현하고 싶다면 해당 파일을 참고하면 될 듯.

 

 

Posted by bloodguy
,