Come esportare JSON da MongoDB utilizzando Robomongo


108

Quindi non ne so molto MongoDB. Sto RoboMongousando il quale mi connetto a MongoDB. Quello che devo fare è questo: c'è una raccolta in quel MongoDB. Voglio esportare i dati da quella raccolta in modo da poterli salvare in un file.

Ho usato l'interfaccia per aprire i dati dalla raccolta come testo e ho fatto un Ctrl+ Ae incollato in un file di testo. Tuttavia, ho scoperto che non tutti i dati vengono copiati e anche che c'erano molti commenti nei dati di testo che interrompono naturalmente il JSON.

Mi chiedo se RoboMongo abbia una Export As JSONstruttura in modo da poter eseguire un'esportazione pulita.

Tutti i suggerimenti sono apprezzati!


Vuoi esportare raccolte particolari o db completo?
Ramesh Murugesan

1
Questa non è una funzionalità corrente di Robomongo, ma ho aggiunto un suggerimento sulla funzionalità nella coda dei problemi di GitHub: Aggiungi esportazione JSON . C'è un suggerimento generale che l' importazione / esportazione dovrebbe essere integrata , ma casi d'uso più dettagliati / pratici sarebbero utili. Ad esempio, dovrebbe supportare l'esportazione di JSON da una raccolta, una query di ricerca, una pipeline di aggregazione? Attualmente l'opzione migliore è utilizzare lo mongoexportstrumento della riga di comando standard .
Stennie

1
@Stennie - grazie per il tuo commento. Immagino che in risposta alla tua domanda: dal punto di vista dell'esperienza del cliente, non ha molta importanza. Nella maggior parte delle altre interfacce DB, il flusso è che esegui una query (con o senza critera), ottieni una serie di risultati. Fare clic con il tasto destro e dire "esporta risultati come ..." Quindi lo stesso dovrebbe essere applicabile qui. Non importa se esporto un'intera raccolta o una query di ricerca. Se il risultato può essere visualizzato nel pannello, dovrebbe essere esportabile.
Variabile indefinita

1
Semplicemente puoi farlomongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
Naren

Risposte:


63

Puoi usare tojsonper convertire ogni record in JSON in uno script di shell MongoDB .

Esegui questo script in RoboMongo:

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

Stampa tutti i risultati come un array simile a JSON.

Il risultato non è realmente JSON! Alcuni tipi, come le date e gli ID oggetto, vengono stampati come chiamate di funzioni JavaScript, ad esempio ISODate("2016-03-03T12:15:49.996Z").

Potrebbe non essere molto efficiente per set di risultati di grandi dimensioni, ma puoi limitare la query. In alternativa, puoi usare mongoexport.


3
Emette un json non valido. Solo record serializzati con json uno per uno
ruX

Per molti casi d'uso, è possibile utilizzare tojson(db.getCollection(...).find(...)["_batch"])l'output dell'intero batch corrente ottenuto dal server.
Yuval

@ Yuval Intendi letteralmente ["_batch"]? Puoi fare un esempio di come usarlo? L'ho provato con Robo 3T 1.2.1, ma dice solo "Script eseguito con successo, ma non ci sono risultati da mostrare".
Florian Winter

7
@FlorianWinter Quello era solo da risultati casuali da armeggiare. Una soluzione migliore è tojson(db.getCollection(...).find(...).toArray()).
Yuval

@Yuval Nice! Allora è la soluzione più semplice, molto meglio della mia. Considera l'idea di pubblicarlo come risposta. (O modifica il mio, ma poi otterrei tutto il credito che meriti, il che sarebbe in qualche modo ingiusto ...)
Florian Winter

58

Un modo rapido e sporco: basta scrivere la query come db.getCollection('collection').find({}).toArray()e fare clic con il tasto destro Copy JSON. Incolla i dati nell'editor di tua scelta.

inserisci qui la descrizione dell'immagine


4
! Neat Per niente sporco considerando la mancanza di funzionalità di esportazione in robo3t. Molto più facile per piccoli set di dati rispetto ad altre soluzioni suggerite.
Ilya Luzyanin

30

La funzionalità della shell di Robomongo risolverà il problema. Nel mio caso avevo bisogno di un paio di colonne in 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
È possibile scrivere l'output di questo script in un csv localmente all'interno della shell di Robomongo?
xxxvincxxx

Questo mi dà "Script eseguito correttamente, ma non ci sono risultati da mostrare"
Shanika Ediriweera

Errore: riga 10: lato sinistro non valido nell'assegnazione
Eugen Sunic

19

Ci sono alcune GUI di MongoDB là fuori, alcune di esse hanno il supporto integrato per l'esportazione dei dati. Troverai un elenco completo delle GUI di MongoDB su http://mongodb-tools.com

Hai chiesto di esportare i risultati della query e non di esportare intere raccolte. Dare 3T MongoChef MongoDB GUI un tentativo, questo strumento ha il supporto per il vostro caso specifico utilizzo.


Studio 3T ha svolto il lavoro più facilmente del previsto! : +1:
Vinyll

16

dici "esporta su file" come in un foglio di calcolo? come un .csv?

IMO questo è il modo PIÙ FACILE per farlo in Robo 3T (ex robomongo):

  1. In alto a destra della GUI di Robo 3T c'è un pulsante "Visualizza risultati in modalità testo", fai clic e copia tutto

  2. incolla tutto in questo sito web: https://json-csv.com/

  3. fai clic sul pulsante di download e ora lo hai in un foglio di calcolo.

spero che questo aiuti qualcuno, poiché vorrei che Robo 3T avesse capacità di esportazione


Molto semplice, grazie
Tính Ngô Quang

11

Non eseguire questo comando sulla shell, inserisci questo script al prompt dei comandi con il nome del database, il nome della raccolta e il nome del file, sostituendo tutti i segnaposto.

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

Per me funziona.



5

Espandendo la risposta di Anish, volevo qualcosa che potessi applicare a qualsiasi query per produrre automaticamente tutti i campi anziché doverli definire all'interno dell'istruzione print. Probabilmente può essere semplificato, ma questo era qualcosa di veloce e sporco che funziona alla grande:

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

Se vuoi usare mongoimport , ti consigliamo di esportare in questo modo:

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

2

Utilizzando uno script di shell robomongo:

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

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

Utilizzando il comando di esportazione e importazione di mongodb

Puoi aggiungere il --jsonArrayparametro / flag al tuo filemongoexport comando, questo esporta il risultato come singolo array json.

Quindi specifica il file --jsonArray nuovo flag durante l'importazione.

Oppure rimuovi le parentesi quadre iniziali e finali [] nel file, quindi il file modificato ed esportato verrà importato con il mongoimportcomando senza il--jsonArray flag.

Maggiori informazioni sull'esportazione qui: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

Importa qui: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray


1

Ho avuto lo stesso problema e anche l'esecuzione di script in robomongo (Robo 3T 1.1.1) non consente di copiare i valori e non c'era nemmeno l'opzione di esportazione. Il modo migliore per ottenere questo risultato è usare mongoexport, se mongodb è installato sul tuo locale, puoi usare mongoexport per connetterti al database su qualsiasi server ed estrarre i dati

Per connetterti a Data sul server remoto e al file di output csv, esegui il seguente mongoexport nella riga di 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: aiuta a estrarre le colonne desiderate, es: il contenuto di fields.txt può essere solo:

ID utente

per estrarre solo i valori della colonna "userId"

Dati su server remoto, file di output json:

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

questo estrae tutti i campi nel file json

dati su localhost (mongodb dovrebbe essere in esecuzione su localhost)

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

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


1

Soluzione:

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

inserisci qui la descrizione dell'immagine

Dove:
database ->
nome raccolta mock-server ->
nome file di output api_defs -> childChoreRequest.json


1

Un'estensione alla risposta di Florian Winter per le persone che cercano di generare query pronte per l'esecuzione.

drope insertManyinterrogare utilizzando 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(']);');
}

Il suo output sarà come:

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

0
  1. fai la tua ricerca
  2. la visualizzazione tramite pulsante consente di attivare la modalità JSON
  3. copia il risultato in parola
  4. stampa il risultato dalla parola

Quando ho delle date nel mio documento, restituisce elementi ISODate che non sono in formato json valido.
Constantino Cronemberger,

1
Perché dovresti usare un documento Word per archiviare un'esportazione di database? E perché nel mondo qualcuno dovrebbe voler stampare un database di esportazione?
maesk

@maesk 🤣🤣🤣🤣
Charlie Schliesser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.