MONGODB: DB.PRINTSHARDINGSTATUS () / Sh.Status () Chiama in Java (e JavaScript)
Domanda
Ho bisogno di ottenere una lista di blocchi dopo aver smowarding all'interno del mio codice Java.Il mio codice è semplice e sembra questo:
Mongo m = new Mongo( "localhost" , 27017 );
DB db = m.getDB( "admin" );
Object cr = db.eval("db.printShardingStatus()", 1);
.
Una chiamata di EVAL () restituisce un errore:
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)
.
E, davvero, se esaminiamo il codice di DB.JS, nella riga 891 è presente una chiamata a un metodo PrintsHardingStatus () che non è definito all'interno di un file.All'interno del metodo Sh.Status () nel file Utils_sh.js, c'è anche un commento:
.// Todo: spostare il comma effettivo qui
Importante da menzionare, quando eseguo questi comandi nella riga di comando MONGO, tutto funziona correttamente!
Le mie domande sono:
- .
- C'è qualche altra possibilità di ottenere uno stato di svuotamento completo all'interno del codice Java?(ad esempio con db.command () metodo)
- In caso contrario, altri suggerimenti come evitare il mio problema?
Soluzione
Molte delle funzioni Helper Shell non sono disponibili per l'esecuzione del codice lato server. Nel caso del printShardingStatus()
, ha senso perché non c'è una console da utilizzare per la stampa di uscita e preferiresti avere una stringa restituita. Per fortuna, dovresti essere in grado di sollevare la fonte della funzione Shell e rimproverarlo nella tua applicazione (ad esempio concatenare una stringa restituita invece di stampare direttamente).
$ mongo
MongoDB shell version: 2.2.0
connecting to: test
> db.printShardingStatus
function (verbose) {
printShardingStatus(this.getSiblingDB("config"), verbose);
}
.
Allora, guardiamo la funzione printShardingStatus()
...
> printShardingStatus
function (configDB, verbose) {
if (configDB === undefined) {
configDB = db.getSisterDB("config");
}
var version = configDB.getCollection("version").findOne();
// ...
}
.
Prima di trasformare tutte le istruzioni di uscita nella concatenazione delle stringhe, desideri assicurarsi che gli altri metodi DB siano tutti disponibili per te. Performance-saggio, penso che l'opzione migliore sia quella di porre porre le interruzioni di questa funzione a Java ed evitare del tutto la valutazione JS lato server. Se ti immergi più in profondità nella funzione printShardingStatus()
, vedrai che è semplicemente emettendo find()
sul database di configurazione insieme a alcune query group()
.
Se vuoi attaccare con la valutazione di JS e preferirei non mantenere questo codice all'interno dell'applicazione Java, puoi anche guardare in Memorizzazione di funzioni JS Side-side .
Altri suggerimenti
Hai distribuito correttamente un cluster di Shard? In tal caso, è possibile connettersi a un database MONGO che ha abilitato a svuotare.
Prova a chiamare il metodo db.printsHardingStatus () con un database all'interno del guscio del mongo e vedere cosa succede.
.Apparentemente la funzione JavaScript 'PRINTSHARDINGSTATUS' è disponibile solo per la Shell MONGO e non per l'esecuzione con i comandi del server, per visualizzare il codice avvio mongo.exe e digitare solo 'PrintsHardingStatus' e premere INVIO.
In questo caso scrivere un metodo di estensione sarebbe il migliore per risolvere questo ...
JavaScript Modo di stampa Uscita della query mongodb in un file
1] Crea un file JavaScript
test.js
cursor = db.printShardingStatus();
while(cursor.hasNext()){
printjson(cursor.next());
}
.
2] Esegui
mongo admin --quiet test.js > output.txt
.