Imprimir la salida de la consulta de Mongo en un archivo mientras está en el shell de mongo


2 días de edad con Mongo y tengo un fondo SQL así que tenga paciencia conmigo. Al igual que con mysql, es muy conveniente estar en la línea de comandos MySQL y generar los resultados de una consulta a un archivo en la máquina. Estoy tratando de entender cómo puedo hacer lo mismo con Mongo, mientras estoy en la cáscara

Puedo obtener fácilmente la salida de una consulta que quiero estando fuera del shell y ejecutando el siguiente comando:

mongo localhost:27017/dbname --eval "printjson(db.collectionName.findOne())" >> sample.json

El camino anterior está bien, pero me requiere para salir de la mongo shell o abra una nueva pestaña de terminal para ejecutar este comando. Sería muy conveniente si pudiera simplemente hacer esto mientras todavía esté dentro de la cáscara.

P.d.: la Pregunta es una rama de una pregunta que publiqué en ASÍ que

Author: Community, 2014-03-21

5 answers

AFAIK, no hay una opción interactiva para la salida al archivo, hay una pregunta anterior relacionada con esto: Imprimir la salida de mongodb shell al archivo

Sin embargo, puede registrar toda la sesión del shell si invoca el comando shell with tee:

$ mongo | tee file.txt
MongoDB shell version: 2.4.2
connecting to: test
> printjson({this: 'is a test'})
{ "this" : "is a test" }
> printjson({this: 'is another test'})
{ "this" : "is another test" }
> exit
bye

Entonces obtendrás un archivo con este contenido:

MongoDB shell version: 2.4.2
connecting to: test
> printjson({this: 'is a test'})
{ "this" : "is a test" }
> printjson({this: 'is another test'})
{ "this" : "is another test" }
> exit
bye

Para eliminar todos los comandos y mantener solo la salida json, puede usar un comando similar a:

tail -n +3 file.txt | egrep -v "^>|^bye" > output.json

Entonces obtendrás:

{ "this" : "is a test" }
{ "this" : "is another test" }
 37
Author: Roberto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:11

Si invoca el shell con los argumentos script-file, db address y quiet quiet, puede redirigir la salida (hecha con print (), por ejemplo) a un archivo:

mongo localhost/mydatabase --quiet myScriptFile.js > output 
 11
Author: Rondo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-23 02:04:09

Podemos hacerlo de esta manera -

mongo db_name --quiet --eval 'DBQuery.shellBatchSize = 2000; db.users.find({}).limit(2000)' > users.json

El argumento shellBatchSize se utiliza para determinar cuántas filas puede imprimir el cliente mongo. Su valor predeterminado es 20.

 5
Author: Jyotman Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-04 14:55:56

Puede ser útil para usted simplemente aumentar el número de resultados que se muestran

En el shell de mongo > DBQuery.shellBatchSize = 3000

Y luego puede seleccionar todos los resultados del terminal de una sola vez y pegarlos en un archivo de texto.

es lo Que voy a hacer :)

(de: https://stackoverflow.com/a/3705615/1290746 )

 1
Author: kris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 02:31:15

Combinando varias condiciones:

  • escriba la consulta mongo en el archivo JS y envíela desde la terminal
  • cambiar / definir una base de datos mediante programación
  • muestra todos los registros encontrados
  • cortar las líneas de salida iniciales
  • guarde la salida en el archivo JSON

MyScriptFile.js

// Switch current database to "mydatabase"
db = db.getSiblingDB('mydatabase');

// The mark for cutting initial output off
print("CUT_TO_HERE");

// Main output
// "toArray()" method allows to get all records
printjson( db.getCollection('jobs').find().toArray() );

Enviar la consulta desde terminal

-z clave de sed permite tratar la salida como una sola cadena multilínea

$> mongo localhost --quiet myScriptFile.js | sed -z 's/^.*CUT_TO_HERE\n//' > output.json

 0
Author: SergO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-19 12:41:53