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?
È stato utile?

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top