Respuestas:
El shell proporciona algunas características agradables pero ocultas porque es un entorno interactivo.
Cuando ejecuta comandos desde un archivo javascript a través de mongo commands.js, no obtendrá un comportamiento idéntico.
Hay dos formas de evitar esto.
(1) falsifica el caparazón y hazle creer que estás en modo interactivo
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
o
(2) use Javascript para traducir el resultado de a find()
en un JSON imprimible
mongo dbname command.js > output.json
donde command.js contiene esto (o su equivalente):
printjson( db.collection.find().toArray() )
Esto imprimirá bastante la matriz de resultados, incluido [ ]
: si no lo desea, puede iterar sobre la matriz y printjson()
cada elemento.
Por cierto, si está ejecutando una sola declaración de Javascript, no tiene que ponerla en un archivo y en su lugar puede usar:
$ 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
pero me dio JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
Dado que está haciendo esto en una terminal y solo desea inspeccionar un registro de una manera sensata, puede usar un truco como este:
mongo | tee somefile
Use la sesión como de costumbre, db.collection.find().pretty()
o lo que sea que necesite hacer, ignore la salida larga y salga. Una transcripción de su sesión estará en el archivo tee
escrito.
Tenga en cuenta que la salida puede contener secuencias de escape y otra basura debido a que el shell mongo espera una sesión interactiva. less
maneja estos con gracia.
Simplemente coloque los comandos que desea ejecutar en un archivo, luego páselo al shell junto con el nombre de la base de datos y redirija la salida a un archivo. Entonces, si su comando de búsqueda está adentro find.js
y su base de datos lo está foo
, se vería así:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
funcionó.
Ponga su consulta (por ejemplo db.someCollection.find().pretty()
) en un archivo javascript, digamos query.js
. Luego ejecútelo en el shell de su sistema operativo usando el comando:
mongo yourDb < query.js > outputFile
El resultado de la consulta estará en el archivo llamado 'outputFile'.
De forma predeterminada, Mongo imprime los primeros 20 documentos IIRC. Si desea más, puede definir un nuevo valor para el tamaño del lote en Mongo shell, por ejemplo
DBQuery.shellBatchSize = 100
.
.js
extensión. Puede escribir todas esas agradables consultas de mongo shell sin cambiarlas en absoluto.
Usando print
y JSON.stringify
puede simplemente producir un resultado válido JSON
.
Utilice la --quiet
bandera para filtrar el ruido de la carcasa de la salida.
Utilice la --norc
bandera para evitar la .mongorc.js
evaluación. (Tuve que hacerlo debido a un bonito formateador que uso, que produce una salida JSON no válida ) Use la DBQuery.shellBatchSize = ?
sustitución ?
con el límite del resultado real para evitar la paginación.
Y finalmente, use tee
para canalizar la salida del terminal a un archivo:
// 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()
);
¡Espero que esto ayude!
Usando esta respuesta de Asya Kamsky, escribí un script bat de una línea para Windows. La línea se ve así:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Entonces uno puede ejecutarlo:
exportToJson.bat DbName CollectionName
También hay mongoexport para eso, pero no estoy seguro desde qué versión está disponible.
Ejemplo:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
puedes usar este comando para lograrlo:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json