Jak wyeksportować kolekcję do CSV w MongoDB?

102

Jak wyeksportować wszystkie rekordy z kolekcji MongoDB do .csvpliku?

mongoexport --host localhost --db dbname --collection name --type=csv > test.csv

Pojawia się prośba o podanie nazw pól, które muszę wyeksportować. Czy mogę po prostu wyeksportować wszystkie pola bez określania nazw pól?

Succeed Stha
źródło

Odpowiedzi:

116

@ karoly-horvath ma rację. Pola są wymagane dla CSV.

Zgodnie z tym błędem w narzędziu do śledzenia problemów MongoDB https://jira.mongodb.org/browse/SERVER-4224 MUSISZ podać pola podczas eksportowania do pliku csv . Dokumentacja nie jest w tym jasna. To jest powód błędu.

Spróbuj tego:

mongoexport --host localhost --db dbname --collection name --csv --out text.csv --fields firstName,middleName,lastName

AKTUALIZACJA:

To zatwierdzenie: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 naprawia dokumenty w wersji 3.0.0-rc10 i nowszych. To się zmienia

Fields string `long:"fields" short:"f" description:"comma separated list of field names, e.g. -f name,age"`

do

Fields string `long:"fields" short:"f" description:"comma separated list of field names (required for exporting CSV) e.g. -f \"name,age\" "`

WERSJA 3.0 I POWYŻSZE:

Należy używać --type=csvzamiast, --csvponieważ został wycofany.

Więcej szczegółów: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Pełne polecenie:

mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName
campeterson
źródło
16
Od wersji 3.0.6 mongoexportmówicsv flag is deprecated; please use --type=csv instead
Roman Dibikhin
Dzięki (anonimowi) za edycję WERSJI 3.0 I POWYŻEJ.
campeterson
4
czy istnieje szybki sposób na uwzględnienie wszystkich pól zamiast nazywania każdego?
Kevz
53

Ponadto nie wolno używać spacji między nazwami pól oddzielonymi przecinkami.

ZŁY: -f firstname, lastname

DOBRY: -f firstname,lastname

murphsp1
źródło
27
mongoexport  --help
....
-f [ --fields ] arg     comma separated list of field names e.g. -f name,age
--fieldFile arg         file with fields names - 1 per line

Musisz to ręcznie określić i jeśli się nad tym zastanowisz, ma to sens. MongoDB nie ma schematów; Z drugiej strony CSV ma stały układ kolumn. Nie wiedząc, jakie pola są używane w różnych dokumentach, niemożliwe jest wyprowadzenie zrzutu CSV.

Jeśli masz ustalony schemat, być może mógłbyś pobrać jeden dokument, zebrać z niego nazwy pól za pomocą skryptu i przekazać go do mongoexport.

Karoly Horvath
źródło
1
Szukałem tylko, czy uda mi się pobrać listę pól z rekordu. tj. z db.collection.finOne (). getFields (). Ale myślę, że to nie jest właściwa metoda (getFields). Próbowałem też getKeys (). W przeciwnym razie będę musiał pobrać rekord z hashami klucz: wartość.
Succeed Stha
Próbuję zrobić to samo, ale dowiedzieć się, dlaczego nie importuje plików csv poprawnie. W moim przypadku potrzebuję, aby powiedział mi wszystko o sobie, łącznie z polami, które sam „wymyślił”. Więc w moim przypadku nie ma sensu określać pól, ponieważ nie wiem, czym one są!
Stephen
Na zbioru pole skryptu przodu, napisałem ten rok lub tak z powrotem, może dać ci kilka pomysłów.
arober11
9

Jeśli chcesz, możesz wyeksportować wszystkie kolekcje do csv bez określania --fields(wyeksportuje wszystkie pola).

Z http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ uruchom ten skrypt bash

OIFS=$IFS;
IFS=",";

# fill in your details here
dbname=DBNAME
user=USERNAME
pass=PASSWORD
host=HOSTNAME:PORT

# first get all collections in the database
collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
collectionArray=($collections);

# for each collection
for ((i=0; i<${#collectionArray[@]}; ++i));
do
    echo 'exporting collection' ${collectionArray[$i]}
    # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
    keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
    # now use mongoexport with the set of keys to export the collection to csv
    mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
done

IFS=$OIFS;
Michał
źródło
4
Jedynym problemem z powyższym skryptem jest to, że zakłada on, iż pierwszy dokument w każdej kolekcji zawiera wszystkie możliwe klucze, które mogą pojawić się w dokumencie z tej kolekcji; co może nie mieć miejsca, jeśli typ dokumentu może zawierać tablicę lub zagnieżdżony dokument podrzędny.
arober11
@ arober11 masz rację, zapomniałeś wspomnieć o tym ważnym fakcie. Zwykle uruchamiam skrypt zmniejszania mapy, aby okresowo zbierać wszystkie klucze i używać go do wyciągania wszystkich kluczy
Michael,
3

Nie mogłem zmusić mongoeksportu do zrobienia tego za mnie. Odkryłem, że aby uzyskać wyczerpującą listę wszystkich pól, musisz raz przejrzeć całą kolekcję. Użyj tego do wygenerowania nagłówków. Następnie ponownie przejrzyj kolekcję, aby wypełnić te nagłówki dla każdego dokumentu.

Napisałem skrypt, aby to zrobić. Konwertowanie dokumentów MongoDB na csv niezależnie od różnic w schematach między poszczególnymi dokumentami.

https://github.com/surya-shodan/mongoexportcsv

Suryakumar Sudar
źródło
2

Również jeśli chcesz wyeksportować wewnętrzne pola json, użyj kropki (operator.).

Rekord JSON:

{
    "_id" : "00118685076F2C77",
    "value" : {
        "userIds" : [ 
            "u1"
        ],
        "deviceId" : "dev"
}

polecenie mongoexport z operatorem kropki (przy użyciu mongo w wersji 3.4.7):

./mongoexport --host localhost --db myDB --collection myColl --type = csv --out out.csv --fields value.deviceId, value.userIds

Wyjście CSV:

value.deviceId,value.userIds
d1,"[""u1""]"
d2,"[""u2""]"

Uwaga: upewnij się, że nie eksportujesz tablicy. Spowodowałoby to uszkodzenie formatu CSV, takiego jak pola userIds pokazane powyżej

Lokendra Chauhan
źródło
0

Rozwiązanie dla użytkowników MongoDB Atlas!

Dodaj --fieldsparametr jako nazwy pól oddzielone przecinkami ujęte w podwójne cudzysłowy:

--fields "<FIELD 1>,<FIELD 2>..."

Oto kompletny przykład:

mongoexport --host Cluster0-shard-0/shard1URL.mongodb.net:27017,shard2URL.mongodb.net:27017,shard3URL.mongodb.net:27017 --ssl --username <USERNAME> --password <PASSWORD> --authenticationDatabase admin --db <DB NAME> --collection <COLLECTION NAME> --type <OUTPUT FILE TYPE> --out <OUTPUT FILE NAME> --fields "<FIELD 1>,<FIELD 2>..."
Zameer Ansari
źródło
0

To działa dla mnie Spróbuj

mongoexport --host cluster0-shard-dummy-link.mongodb.net:27017 --db yourdbname --forceTableScan   --collection users --type json --out /var/www/html/user.json --authenticationDatabase admin --ssl --username Yourusername --password Yourpassword

Powyżej cmd zwróć całe dane kolekcji użytkowników, jeśli chcesz użyć pola filtru, a następnie dodaj --fields = email, name

manoj patel
źródło
Czym to się różni od odpowiedzi poniżej?
Daniel W.
mongodump --host cluster0-shard.mongodb.net:27017 --db nazwa bazy danych --forceTableScan --out / var / www / html / documents / db-12-2020 --authenticationDatabase admin --ssl --username youruname - hasło twoje hasło możesz wypróbować to również daje ci całe kolekcje.
manoj patel
0

działa dla mnie zdalnie do kontenera docker z mongo: 4.2.6

mongoexport -h mongodb:27017 --authenticationDatabase=admin -u username -p password -d database -c collection -q {"created_date": { "$gte": { "$date": "2020-08-03T00:00:00.000Z" }, "$lt": { "$date": "2020-08-09T23:59:59.999Z" } } } --fields=somefield1,somefield2 --type=csv --out=/archive.csv
user739313
źródło
-1

Dla wszystkich, którzy utknęli w błędzie.

Pozwólcie, że przedstawię wam rozwiązanie z krótkim wyjaśnieniem tego samego: -

polecenie połączenia: -

mongoexport --host your_host --port your_port -u your_username -p your_password --db your_db --collection your_collection --type=csv --out file_name.csv --fields all_the_fields --authenticationDatabase admin

--host -> host serwera Mongo

--port -> port serwera Mongo

-u -> nazwa użytkownika

-p -> hasło

--db -> db, z którego chcesz eksportować

--collection -> kolekcja, którą chcesz wyeksportować

--type -> typ eksportu w moim przypadku CSV

--out -> nazwa pliku, do którego chcesz wyeksportować

--fields -> wszystkie pola, które chcesz wyeksportować (nie wstawiaj spacji między dwoma nazwami pól między przecinkami w przypadku CSV)

--authenticationDatabase -> baza danych, w której przechowywane są wszystkie informacje o użytkowniku

officialrahulmandal
źródło
-2

Poniższe polecenie służy do eksportowania kolekcji do formatu CSV.

Uwaga: naagto baza danych, employee1_jsonto zbiór.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
Naag
źródło
oto, co mongodb 4 return: Failed: tryb CSV wymaga listy pól
PIĄTEK