2012-10-02 5 views
2

Java 코드 내에서 sharding 후 청크 목록을 가져와야합니다. 내 코드는 간단하고 다음과 같습니다 : 우리가 db.js의 코드로 보면 라인에, 정말,Mongodb : db.printShardingStatus()/sh.status() Java (및 JavaScript) 호출

Exception in thread "main" com.mongodb.CommandResult$CommandFailure: command failed [$eval]: { "serverUsed" : "localhost/127.0.0.1:27017" , "errno" : -3.0 , "errmsg" : "invoke failed: JS Error: ReferenceError: printShardingStatus is not defined src/mongo/shell/db.js:891" , "ok" : 0.0} 
    at com.mongodb.CommandResult.getException(CommandResult.java:88) 
    at com.mongodb.CommandResult.throwOnError(CommandResult.java:134) 
    at com.mongodb.DB.eval(DB.java:340) 
    at org.sm.mongodb.MongoTest.main(MongoTest.java:35) 

그리고 :

Mongo m = new Mongo("localhost" , 27017); 

DB db = m.getDB("admin"); 

Object cr = db.eval("db.printShardingStatus()", 1); 

평가의()에 대한 호출이 오류를 반환

891 파일 내에서 정의되지 않은 printShardingStatus() 메서드 호출이 있습니다. 나는 몽고 명령 행에서 다음 명령을 실행할 때

// TODO: move the actual commadn here

언급 중요한, 모든 것이 제대로 작동 : utils_sh.js 파일 sh.status() 메소드의 내부에서도 의견이 있습니다!

내 질문은 : 자바 코드 내에서 전체 샤딩 상태를 얻기의 다른 가능성이

  • 있습니까? (예 : DB.command() 메서드 사용)
  • 그렇지 않은 경우, 다른 제안 사항으로 내 문제를 피할 수 있습니까?

답변

7

서버 측 코드 실행에는 많은 쉘 핼퍼 기능을 사용할 수 없습니다. printShardingStatus()의 경우 출력 인쇄에 사용할 콘솔이 없기 때문에 문자열을 반환해야하므로 의미가 있습니다. 고맙게도 셸 함수의 소스를 끌어 와서 응용 프로그램에서 다시 구현할 수 있어야합니다 (예 : 직접 인쇄하는 대신 반환 된 문자열 연결). 그래서

$ mongo 
MongoDB shell version: 2.2.0 
connecting to: test 
> db.printShardingStatus 
function (verbose) { 
    printShardingStatus(this.getSiblingDB("config"), verbose); 
} 

, ...의이 printShardingStatus() 기능을 살펴 보자

> printShardingStatus 
function (configDB, verbose) { 
    if (configDB === undefined) { 
     configDB = db.getSisterDB("config"); 
    } 
    var version = configDB.getCollection("version").findOne(); 

    // ... 
} 

문자열 연결로 출력 문을 모두 돌리면, 당신은 다른 DB 방법을 모두 사용할 수 있는지 확인 싶어하기 전에 너에게. 성능면에서, 최선의 선택은이 함수의 내부를 Java로 이식하고 서버 측 JS 평가를 피하는 것이라고 생각합니다. printShardingStatus() 함수에 대해 자세히 살펴보면 group() 쿼리와 함께 설정 데이터베이스에 find()을 발급 한 것만 알 수 있습니다.

JS를 평가하고 Java 응용 프로그램 내에이 코드를 보관하지 않으려면 storing JS functions server-side을 참조하십시오. 파일

1 MongoDB의 쿼리의 출력을 인쇄

+0

딱! config DB에서 실행되는 DB.getCollection() 메소드와 함께 작동합니다. 방법을 보여 주셔서 감사합니다! –

1

샤드 클러스터를 올바르게 배치 했습니까? 그렇다면 sharding이 활성화 된 mongo 데이터베이스에 연결할 수 있습니다.

mongo 셸 내의 해당 데이터베이스를 사용하여 db.printShardingStatus() 메서드를 호출하고 어떤 결과가 발생하는지보십시오.

Apparently the Javascript function 'printShardingStatus' is only available for the mongo shell and not for execution with server commands, to see the code start mongo.exe and type only 'printShardingStatus' and press enter.

In this case writing an extension method would be the best for solving this...

+0

그래, 나는 그것을 언급하는 것을 잊었다 실행 - 몽고 내에서 모든 것이 제대로 작동 쉘 ... –

1

자바 스크립트 방법] 자바 스크립트 파일

테스트를 만들 수 있습니다.JS

cursor = db.printShardingStatus(); 
while(cursor.hasNext()){ 
    printjson(cursor.next()); 
} 

2]

mongo admin --quiet test.js > output.txt 
+0

'db.printShardingStatus();'는 아무 값도 반환하지 않고 단지 샤드 상태를 화면에 출력합니다. 따라서'cursor'에 저장하는 것은 작동하지 않습니다. – ares