Jak wyeksportować JSON z MongoDB za pomocą Robomongo


108

Więc nie wiem zbyt wiele o MongoDB. Mam za RoboMongopomocą którego łączę się z MongoDB. Muszę zrobić to - w tym MongoDB jest kolekcja. Chcę wyeksportować dane z tej kolekcji, aby móc je zapisać w pliku.

Użyłem interfejsu, aby otworzyć dane z kolekcji jako tekst, zrobiłem Ctrl+ Ai wkleiłem do pliku tekstowego. Jednak odkryłem, że nie wszystkie dane są kopiowane, a także, że w danych tekstowych było wiele komentarzy, które w naturalny sposób psują JSON.

Zastanawiam się, czy RoboMongo ma Export As JSONmożliwość wykonania czystego eksportu.

Wszelkie wskazówki są mile widziane!


Chcesz wyeksportować określone kolekcje lub pełną bazę danych?
Ramesh Murugesan

1
To nie jest aktualna funkcja Robomongo, ale dodałem sugestię funkcji w kolejce zgłoszeń na github: Dodaj eksport JSON . Istnieje ogólna sugestia, że import / eksport powinien być zintegrowany , ale pomocne byłyby bardziej szczegółowe / praktyczne przypadki użycia. Na przykład, czy powinno to obsługiwać eksportowanie JSON z kolekcji, zapytania wyszukiwania, potoku agregacji? Obecnie najlepszą opcją jest użycie standardowego mongoexportnarzędzia wiersza poleceń.
Stennie

1
@Stennie - dziękujemy za komentarz. Myślę, że odpowiadając na Twoje pytanie - z punktu widzenia obsługi klienta nie ma to większego znaczenia. W większości innych interfejsów DB przepływ polega na tym, że uruchamiasz zapytanie (z lub bez krytyki), uzyskujesz zestaw wyników. Kliknij prawym przyciskiem myszy i powiedz „Eksportuj wyniki jako ...”. To samo powinno mieć zastosowanie tutaj. Nie ma znaczenia, czy eksportuję całą kolekcję, czy zapytanie wyszukiwania. Jeśli wynik można wyświetlić w panelu, powinien być możliwy do wyeksportowania.
Nieokreślona zmienna

1
Po prostu możesz to zrobićmongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
Naren

Odpowiedzi:


64

Możesz użyć tojsondo przekonwertowania każdego rekordu na JSON w skrypcie powłoki MongoDB .

Uruchom ten skrypt w RoboMongo:

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

Spowoduje to wyświetlenie wszystkich wyników jako tablicy podobnej do JSON.

Wynik nie jest tak naprawdę JSON! Niektóre typy, takie jak daty i identyfikatory obiektów, są drukowane jako wywołania funkcji JavaScript, np ISODate("2016-03-03T12:15:49.996Z")..

Może nie być bardzo wydajne w przypadku dużych zestawów wyników, ale można ograniczyć zapytanie. Alternatywnie możesz użyć mongoexport.


3
Wyprowadza nieprawidłowy plik JSON. Tylko rekordy w
serii JSON

W wielu przypadkach użycia można użyć tojson(db.getCollection(...).find(...)["_batch"])do wyprowadzenia całej bieżącej partii uzyskanej z serwera.
Yuval

@Yuval Masz na myśli dosłownie ["_batch"]? Czy możesz podać przykład, jak tego używać? Wypróbowałem to z Robo 3T 1.2.1, ale wyświetla tylko komunikat „Skrypt został wykonany pomyślnie, ale nie ma wyników do wyświetlenia”.
Florian Winter

7
@FlorianWinter To było tylko z przypadkowych odkryć podczas majstrowania. Lepszym rozwiązaniem jest tojson(db.getCollection(...).find(...).toArray()).
Yuval

@Yuval Nice! To najłatwiejsze rozwiązanie, znacznie lepsze niż moje. Rozważ opublikowanie tego jako odpowiedzi. (Lub edytuj moje, ale wtedy dostałbym całą zasługę, na jaką zasługujesz, co byłoby nieco niesprawiedliwe ...)
Florian Winter

59

Szybki i nieprzyjemny sposób: po prostu wpisz zapytanie jako db.getCollection('collection').find({}).toArray()i kliknij prawym przyciskiem myszy Copy JSON. Wklej dane w wybranym edytorze.

wprowadź opis obrazu tutaj


4
Schludny! W ogóle nie jest brudny, biorąc pod uwagę brak funkcji eksportu w robo3t. Znacznie łatwiejsze w przypadku małych zestawów danych w porównaniu z innymi sugerowanymi rozwiązaniami.
Ilya Luzyanin

30

Funkcjonalność powłoki Robomongo rozwiąże problem. W moim przypadku potrzebowałem kilku kolumn w formacie 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
Czy można zapisać wynik tego skryptu w lokalnym pliku csv w powłoce Robomongo?
xxxvincxxx

W ten sposób otrzymuję informację „Skrypt został wykonany pomyślnie, ale nie ma wyników do wyświetlenia”
Shanika Ediriweera

Błąd: Wiersz 10: Nieprawidłowa lewa strona w przypisaniu
Eugen Sunic

19

Istnieje kilka GUI MongoDB, niektóre z nich mają wbudowaną obsługę eksportowania danych. Pełną listę GUI MongoDB znajdziesz na http://mongodb-tools.com

Pytałeś o wyeksportowanie wyników zapytania, a nie o eksportowanie całych kolekcji. Wypróbuj 3T MongoChef MongoDB GUI , to narzędzie obsługuje określone przypadki użycia.


Studio 3T całkowicie wykonało pracę łatwiej niż oczekiwano! : +1:
vinyll

16

powiesz „eksportuj do pliku” jak w arkuszu kalkulacyjnym? lubisz .csv?

IMO to NAJŁATWIEJSZY sposób na zrobienie tego w Robo 3T (dawniej robomongo):

  1. W prawym górnym rogu GUI Robo 3T znajduje się przycisk „Wyświetl wyniki w trybie tekstowym”, kliknij go i skopiuj wszystko

  2. wklej wszystko na tej stronie: https://json-csv.com/

  3. kliknij przycisk pobierania, a teraz masz go w arkuszu kalkulacyjnym.

Mam nadzieję, że to komuś pomoże, bo chciałbym, żeby Robo 3T miał możliwości eksportowe


11

Nie uruchamiaj tego polecenia w powłoce, wprowadź ten skrypt w wierszu polecenia, podając nazwę bazy danych, nazwę kolekcji i nazwę pliku, wszystkie zastępując symbole zastępcze.

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

Mi to pasuje.



5

Rozwijając odpowiedź Anisha, chciałem czegoś, co mógłbym zastosować do dowolnego zapytania, aby automatycznie wyświetlić wszystkie pola, zamiast definiować je w instrukcji print. Prawdopodobnie można to uprościć, ale było to coś szybkiego i brudnego, co działa świetnie:

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

Jeśli chcesz używać mongoimport , będziesz chciał wyeksportować w ten sposób:

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

2

Korzystanie ze skryptu powłoki robomongo:

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

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

Korzystanie z polecenia eksportu i importu mongodb

Możesz dodać --jsonArrayparametr / flagę do swojego mongoexportpolecenia, co spowoduje wyeksportowanie wyniku jako pojedynczej tablicy JSON.

Następnie --jsonArrayponownie określ flagę podczas importowania.

Lub usuń początkowy i końcowy nawias tablicowy [] w pliku, a następnie zmodyfikowany i wyeksportowany plik zostanie zaimportowany za pomocą mongoimportpolecenia bez --jsonArrayflagi.

Więcej o eksporcie tutaj: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

Importuj tutaj: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray


1

Miałem ten sam problem, a uruchomienie skryptu w robomongo (Robo 3T 1.1.1) również nie pozwala na kopiowanie wartości i nie było też opcji eksportu. Najlepszym sposobem, w jaki mogłem to osiągnąć, jest użycie mongoexport, jeśli mongodb jest zainstalowany na twoim lokalnym, możesz użyć mongoexport do połączenia się z bazą danych na dowolnym serwerze i wyodrębnienia danych

Aby połączyć się z danymi na serwerze zdalnym i plikiem wyjściowym csv, uruchom następujący mongoexport w wierszu poleceń

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

fieldFile: pomaga wyodrębnić żądane kolumny, np. zawartość pliku fields.txt może być po prostu:

identyfikator użytkownika

aby wyodrębnić tylko wartości z kolumny „userId”

Dane na serwerze zdalnym, plik wyjściowy json:

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

spowoduje to wyodrębnienie wszystkich pól do pliku json

dane na hoście lokalnym (mongodb powinien działać na hoście lokalnym)

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

Źródła: https://docs.mongodb.com/manual/reference/program/mongoexport/#use


1

Rozwiązanie:

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

wprowadź opis obrazu tutaj

Gdzie:
baza danych ->
nazwa kolekcji serwera pozornego ->
nazwa pliku wyjściowego api_defs -> childChoreRequest.json


1

Rozszerzenie odpowiedzi Floriana Wintera dla osób chcących wygenerować gotowe do wykonania zapytanie.

dropi insertManyzapytaj używając 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(']);');
}

Jego wynik będzie wyglądał następująco:

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

0
  1. przeprowadź wyszukiwanie
  2. widok przycisku powoduje wyświetlenie w trybie JSON
  3. skopiuj wynik do słowa
  4. wypisuje wynik ze słowa

Kiedy mam daty w moim dokumencie, zwraca elementy ISODate, które nie są prawidłowym formatem json.
Constantino Cronemberger

1
Dlaczego miałbyś używać dokumentu programu Word do przechowywania eksportu bazy danych? A dlaczego na świecie ktoś miałby chcieć wydrukować eksport bazy danych?
maesk

@maesk 🤣🤣🤣🤣
Charlie Schliesser
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.