Cómo exportar JSON desde MongoDB usando Robomongo


108

Así que no sé mucho sobre MongoDB. Tengo un RoboMongouso que me conecto a un MongoDB. Lo que necesito hacer es esto: hay una colección en ese MongoDB. Quiero exportar los datos de esa colección para poder guardarlos en un archivo.

Usé la interfaz para abrir los datos de la colección como texto e hice un Ctrl+ Ay los pegué en un archivo de texto. Sin embargo, descubrí que no se copian todos los datos y también que había muchos comentarios en los datos de texto que, naturalmente, rompen el JSON.

Me pregunto si RoboMongo tiene una Export As JSONinstalación para que pueda hacer una exportación limpia.

¡Se agradece cualquier sugerencia!


¿Quiere exportar colecciones particulares o db completas?
Ramesh Murugesan

1
Esta no es una característica actual de Robomongo, pero agregué una sugerencia de característica en la cola de problemas de github: Agregar exportación JSON . Existe una sugerencia general de que la importación / exportación debe integrarse , pero serían útiles casos de uso más detallados / prácticos. Por ejemplo, ¿debería admitir la exportación de JSON desde una colección, una consulta de búsqueda, una canalización de agregación? Actualmente, su mejor opción es utilizar la mongoexportherramienta de línea de comandos estándar .
Stennie

1
@Stennie, gracias por tu comentario. Supongo que en respuesta a su pregunta, desde el punto de vista de la experiencia del cliente, realmente no importa. En la mayoría de las otras interfaces de base de datos, el flujo es que ejecuta una consulta (con o sin criterios) y obtiene un conjunto de resultados. Haga clic derecho y diga "exportar resultados como ...". Lo mismo debería aplicarse aquí. No importa si estoy exportando una colección completa o una consulta de búsqueda. Si el resultado puede mostrarse en el panel, entonces debería ser exportable.
Variable indefinida

1
Simplemente puedes hacer estomongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
Naren

Respuestas:


63

Puede usar tojsonpara convertir cada registro a JSON en un script de shell MongoDB .

Ejecute este script en RoboMongo:

var cursor = db.getCollection('foo').find({}, {});
while(cursor.hasNext()) {
    print(tojson(cursor.next()))
}

Esto imprime todos los resultados como una matriz similar a JSON.

¡El resultado no es realmente JSON! Algunos tipos, como las fechas y los ID de objeto, se imprimen como llamadas a la función de JavaScript, por ejemplo, ISODate("2016-03-03T12:15:49.996Z").

Puede que no sea muy eficaz para conjuntos de resultados grandes, pero puede limitar la consulta. Alternativamente, puede usar mongoexport.


3
Genera un json no válido. Solo registros serializados en json uno por uno
ruX

Para muchos casos de uso, se puede usar tojson(db.getCollection(...).find(...)["_batch"])para generar la totalidad del lote actual obtenido del servidor.
Yuval

@Yuval ¿Quieres decir literalmente ["_batch"]? ¿Puede dar un ejemplo de cómo usar esto? Probé esto con Robo 3T 1.2.1, pero solo dice "El script se ejecutó correctamente, pero no hay resultados para mostrar".
Florian Winter

7
@FlorianWinter Eso fue solo a partir de hallazgos aleatorios de juguetear. Una mejor solución es tojson(db.getCollection(...).find(...).toArray()).
Yuval

@Yuval Nice! Entonces esa es la solución más fácil, mucho mejor que la mía. Considere publicarlo como respuesta. (O editar el mío, pero luego obtendría todo el crédito que te mereces, lo cual sería algo injusto ...)
Florian Winter

58

Una forma rápida y sucia: simplemente escriba su consulta como db.getCollection('collection').find({}).toArray()y haga clic derecho Copy JSON. Pegue los datos en el editor de su elección.

ingrese la descripción de la imagen aquí


4
¡Ordenado! Nada sucio considerando la falta de funcionalidad de exportación en robo3t. Mucho más fácil para pequeños conjuntos de datos en comparación con otras soluciones sugeridas.
Ilya Luzyanin

30

La funcionalidad de shell de Robomongo resolverá el problema. En mi caso, necesitaba un par de columnas en formato CSV.

var cursor = db.getCollection('Member_details').find({Category: 'CUST'},{CustomerId :1,Name :1,_id:0})

while (cursor.hasNext()) {
    var record = cursor.next();   
    print(record.CustomerID + "," + record.Name)
}

Output : -------

334, Harison
433, Rechard
453, Michel
533, Pal

1
¿Es posible escribir la salida de este script en un csv localmente dentro del shell de Robomongo?
xxxvincxxx

Esto me da "Script ejecutado correctamente, pero no hay resultados para mostrar"
Shanika Ediriweera

Error: Línea 10: Lado izquierdo no válido en la asignación
Eugen Sunic

19

Hay algunas GUI de MongoDB, algunas de ellas tienen soporte incorporado para la exportación de datos. Encontrará una lista completa de las GUI de MongoDB en http://mongodb-tools.com

Ha preguntado sobre la exportación de los resultados de su consulta y no sobre la exportación de colecciones completas. Dar 3T MongoChef MongoDB interfaz gráfica de usuario de un intento, esta herramienta tiene soporte para el caso de uso específico.


Studio 3T hizo el trabajo más fácil de lo esperado. : +1:
vinyll

16

dice "exportar a archivo" como en una hoja de cálculo? como un .csv?

En mi opinión, esta es la forma MÁS FÁCIL de hacer esto en Robo 3T (anteriormente robomongo):

  1. En la parte superior derecha de la GUI de Robo 3T hay un botón "Ver resultados en modo texto", haz clic en él y copia todo

  2. pegue todo en este sitio web: https://json-csv.com/

  3. haga clic en el botón de descarga y ahora lo tiene en una hoja de cálculo.

Espero que esto ayude a alguien, ya que desearía que Robo 3T tuviera capacidades de exportación


Muy simple, gracias
Tính Ngô Quang

11

No ejecute este comando en el shell, ingrese este script en un símbolo del sistema con el nombre de su base de datos, el nombre de la colección y el nombre del archivo, todo reemplazando los marcadores de posición.

mongoexport --db (Database name) --collection (Collection Name) --out (File name).json

Esto funciona para mi.



5

Ampliando la respuesta de Anish, quería algo que pudiera aplicar a cualquier consulta para generar automáticamente todos los campos en lugar de tener que definirlos dentro de la declaración de impresión. Probablemente se pueda simplificar, pero esto fue algo rápido y sucio que funciona muy bien:

var cursor = db.getCollection('foo').find({}, {bar: 1, baz: 1, created_at: 1, updated_at: 1}).sort({created_at: -1, updated_at: -1});

while (cursor.hasNext()) {
    var record = cursor.next();
    var output = "";
    for (var i in record) {
      output += record[i] + ",";
    };
    output = output.substring(0, output.length - 1);
    print(output);
}

4

Si desea utilizar mongoimport , querrá exportar de esta manera:

db.getCollection('tables')
  .find({_id: 'q3hrnnoKu2mnCL7kE'})
  .forEach(function(x){printjsononeline(x)});

2

Usando un script de shell robomongo:

//on the same db
var cursor = db.collectionname.find();

while (cursor.hasNext()) {
    var record = cursor.next();   
    db.new_collectionname.save(record);
}

Usando el comando de exportación e importación de mongodb

Puede agregar el --jsonArrayparámetro / bandera a su mongoexportcomando, esto exporta el resultado como una sola matriz json.

Luego, simplemente especifique la --jsonArraybandera nuevamente al importar.

O elimine los corchetes de matriz inicial y final [] en el archivo, luego su archivo modificado y exportado se importará con el mongoimportcomando sin la --jsonArraybandera.

Más sobre Exportar aquí: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

Importar aquí: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray


1

Tuve este mismo problema, y ​​ejecutar un script en robomongo (Robo 3T 1.1.1) tampoco permite copiar valores y tampoco había una opción de exportación. La mejor manera de lograr esto es usar mongoexport, si mongodb está instalado en su local, puede usar mongoexport para conectarse a la base de datos en cualquier servidor y extraer datos

Para conectarse a los datos en el servidor remoto y al archivo de salida csv, ejecute el siguiente mongoexport en su línea de comando

mongoexport --host HOSTNAME --port PORT --username USERNAME --password "PASSWORD" --collection COLLECTION_NAME --db DATABASE_NAME --out OUTPUTFILE.csv --type=csv --fieldFile fields.txt

fieldFile: ayuda a extraer las columnas deseadas, por ejemplo: el contenido de fields.txt puede ser simplemente:

userId

para extraer solo valores de la columna 'userId'

Datos en servidor remoto, archivo de salida json:

mongoexport --host HOST_NAME --port PORT --username USERNAME --password "PASSWORD" --collection COLECTION_NAME --db DATABASE_NAME --out OUTPUT.json

esto extrae todos los campos en el archivo json

datos en localhost (mongodb debe ejecutarse en localhost)

mongoexport --db DATABASE_NAME --collection COLLECTION --out OUTPUT.json

Referencia: https://docs.mongodb.com/manual/reference/program/mongoexport/#use


1

Solución:

mongoexport --db test --collection traffic --out traffic.json<br><br>

ingrese la descripción de la imagen aquí

Donde:
base de datos ->
nombre de la colección del servidor simulado ->
nombre del archivo de salida api_defs -> childChoreRequest.json


1

Una extensión de la respuesta de Florian Winter para las personas que buscan generar una consulta lista para ejecutar.

dropy insertManyconsulta usando cursor:

{
    // collection name
    var collection_name = 'foo';

    // query
    var cursor = db.getCollection(collection_name).find({});

    // drop collection and insert script
    print('db.' + collection_name + '.drop();');
    print('db.' + collection_name + '.insertMany([');

    // print documents
    while(cursor.hasNext()) {
        print(tojson(cursor.next()));

        if (cursor.hasNext()) // add trailing "," if not last item
            print(',');
    }

    // end script
    print(']);');
}

Su salida será como:

db.foo.drop();
db.foo.insertMany([
{
    "_id" : ObjectId("abc"),
    "name" : "foo"
}
,
{
    "_id" : ObjectId("xyz"),
    "name" : "bar"
}
]);

0
  1. haz tu busqueda
  2. resultados de la vista de botón pulsador en modo JSON
  3. copiar el resultado a la palabra
  4. imprimir el resultado de la palabra

Cuando tengo fechas en mi documento, devuelve elementos ISODate que no son formato json válido.
Constantino Cronemberger

1
¿Por qué usaría un documento de Word para almacenar una exportación de base de datos? ¿Y por qué diablos querría alguien imprimir una exportación de base de datos?
maesk

@maesk 🤣🤣🤣🤣
Charlie Schliesser
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.