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.