Risposte:
La shell fornisce alcune caratteristiche carine ma nascoste perché è un ambiente interattivo.
Quando esegui comandi da un file javascript tramite mongo commands.js non otterrai un comportamento del tutto identico.
Ci sono due modi per aggirare questo problema.
(1) simula il guscio e fagli credere di essere in modalità interattiva
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
oppure
(2) utilizzare Javascript per tradurre il risultato di a find()
in un JSON stampabile
mongo dbname command.js > output.json
dove command.js contiene questo (o il suo equivalente):
printjson( db.collection.find().toArray() )
Questo stamperà abbastanza l'array di risultati, incluso [ ]
- se non vuoi che puoi iterare sull'array e su printjson()
ogni elemento.
A proposito, se stai eseguendo solo una singola istruzione Javascript non devi metterla in un file e invece puoi usare:
$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
ma mi ha dato JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
Dato che lo stai facendo su un terminale e vuoi solo ispezionare un record in modo sano, puoi usare un trucco come questo:
mongo | tee somefile
Usa la sessione come di consueto db.collection.find().pretty()
o qualunque cosa tu debba fare, ignora il lungo output ed esci. Una trascrizione della tua sessione sarà nel file tee
scritto a.
Tieni presente che l'output potrebbe contenere sequenze di escape e altri rifiuti a causa della shell di mongo che si aspetta una sessione interattiva. less
li gestisce con grazia.
Basta inserire i comandi che si desidera eseguire in un file, quindi passarlo alla shell insieme al nome del database e reindirizzare l'output a un file. Quindi, se il tuo comando find è in find.js
e il tuo database è foo
, sarà simile a questo:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
ha funzionato.
Metti la tua query (ad esempio db.someCollection.find().pretty()
) in un file javascript, diciamo query.js
. Quindi eseguilo nella shell del tuo sistema operativo usando il comando:
mongo yourDb < query.js > outputFile
Il risultato della query sarà nel file denominato "outputFile".
Per impostazione predefinita, Mongo stampa i primi 20 documenti IIRC. Se vuoi di più puoi definire un nuovo valore per la dimensione del batch nella shell Mongo, ad es
DBQuery.shellBatchSize = 100
.
.js
estensione. Puoi scrivere tutte quelle belle query di mongo shell senza cambiarle affatto.
Usando print
e JSON.stringify
puoi semplicemente produrre un risultato valido JSON
.
Usa --quiet
flag per filtrare il rumore della shell dall'output.
Usa --norc
flag per evitare la .mongorc.js
valutazione. (Ho dovuto farlo a causa di un bel formattatore che uso, che produce un output JSON non valido ) Usa la DBQuery.shellBatchSize = ?
sostituzione ?
con il limite del risultato effettivo per evitare il paging.
Infine, usa tee
per reindirizzare l'output del terminale a un file:
// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json
// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
print(JSON.stringify(data, null, 2));
}
toPrint(
db.getCollection('myCollection').find().toArray()
);
Spero che questo ti aiuti!
Usando questa risposta di Asya Kamsky, ho scritto uno script bat di una riga per Windows. La linea si presenta così:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Quindi si può eseguirlo:
exportToJson.bat DbName CollectionName
C'è anche mongoexport per quello, ma non sono sicuro da quale versione sia disponibile.
Esempio:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
puoi usare questo comando per ottenerlo:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json