MongoDB'de koleksiyon CSV'ye nasıl aktarılır?


105

Bir MongoDB koleksiyonundaki tüm kayıtları bir .csvdosyaya nasıl aktarırsınız ?

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

Bu, dışa aktarmam gereken alanların adını belirlememi istiyor. Alanların adlarını belirtmeden tüm alanları dışa aktarabilir miyim?

Yanıtlar:


121

@ karoly-horvath haklı. Csv için alanlar gereklidir.

MongoDB sorun izleyicisindeki bu hataya göre https://jira.mongodb.org/browse/SERVER-4224 bir csv'ye aktarırken alanları sağlamanız GEREKİR . Dokümanlar bu konuda net değil. Hatanın nedeni budur.

Bunu dene:

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

GÜNCELLEME:

Bu taahhüt: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 , 3.0.0-rc10 ve sonraki sürümler için dokümanları düzeltir. Değişir

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

-e

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

SÜRÜM 3.0 VE ÜSTÜ:

Kullanımdan kaldırıldığı için --type=csvyerine kullanmalısınız --csv.

Daha fazla ayrıntı: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Tam komut:

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

18
3.0.6 sürümünün mongoexportdediği gibicsv flag is deprecated; please use --type=csv instead
Roman Dibikhin

SÜRÜM 3.0 VE YUKARI düzenlemesi için teşekkürler (anonim olarak).
campeterson

4
Her alanları adlandırmak yerine tüm alanları dahil etmenin hızlı bir yolu var mı?
Kevz

53

Ayrıca, virgülle ayrılmış alan adları arasında boşluk bırakmanıza izin verilmez.

KÖTÜ: -f firstname, lastname

İYİ: -f firstname,lastname


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

Manuel olarak belirlemelisiniz ve eğer düşünürseniz, bu çok mantıklı. MongoDB şemasızdır; Öte yandan CSV, sütunlar için sabit bir düzene sahiptir. Farklı belgelerde hangi alanların kullanıldığını bilmeden CSV dökümünün çıktısını almak imkansızdır.

Sabit bir şemanız varsa, belki bir belge alabilir, alan adlarını bir komut dosyasıyla toplayabilir ve mongoexport'a iletebilirsiniz.


1
Bir kayıttan alanların listesini alabilir miyim diye bakıyordum. yani db.collection.finOne (). getFields () kaynağından. Ama sanırım bu doğru yöntem değil (getFields). GetKeys () de denedim. Aksi takdirde key: value hash değerlerine sahip kaydı almam gerekecek.
2011'de

Ben de aynı şeyi yapmaya çalışıyorum ama neden csv dosyalarını düzgün şekilde içe aktarmadığını anlamaya çalışıyorum. Benim durumumda, bana kendisi hakkında her şeyi, hangi alanları kendi başına "icat ettiği" de dahil olmak üzere anlatması gerekiyor. Bu yüzden benim durumumda alanları belirtmek çok mantıklı değil çünkü hepsinin ne olduğunu bilmiyorum!
Stephen

Alan hasat komut cephesinde, ben yayınlanmıştır bu size birkaç fikir verebilir, bir yıl kadar geriye.
arober11

9

İsterseniz, tüm koleksiyonları belirtmeden csv'ye --fieldsaktarabilirsiniz (tüm alanları dışa aktarır).

Gönderen http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ bu bash komut dosyasını çalıştırmak

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;

4
Yukarıdaki komut dosyasıyla ilgili tek sorun, her koleksiyondaki ilk belgenin o koleksiyondaki bir belgede görünebilecek tüm olası anahtarları içerdiğini varsaymasıdır; belge türü bir dizi veya iç içe geçmiş alt belge içerebiliyorsa durum bu olmayabilir.
arober11

@ arober11 haklısın, bu önemli gerçeği söylemeyi unuttum. Genelde yaptığım şey, tüm anahtarları periyodik olarak toplamak için bir harita azaltma betiği çalıştırmak ve tüm anahtarları çekmek için kullanmaktır
Michael

3

Mongoexport'tan bunu benim için yaptıramadım. Tüm alanların kapsamlı bir listesini almak için tüm koleksiyonda bir kez dolaşmanız gerektiğini buldum. Başlıkları oluşturmak için bunu kullanın. Ardından, bu başlıkları her belge için doldurmak üzere koleksiyonda yeniden döngü yapın.

Bunu yapmak için bir senaryo yazdım. Tek tek belgeler arasındaki şema farklılıklarından bağımsız olarak MongoDB belgelerini csv'ye dönüştürme.

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


2

Ayrıca, iç json alanlarını dışa aktarmak istiyorsanız, nokta (. Operatörü) kullanın.

JSON kaydı:

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

nokta operatörlü mongoexport komutu (mongo 3.4.7 sürümünü kullanarak):

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

Çıktı csv:

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

Not: Bir diziyi dışa aktarmadığınızdan emin olun. Yukarıda gösterilen alan kullanıcı kimlikleri gibi CSV biçimini bozabilir


1

benim için çalışıyor mongo ile bir liman işçisi kapsayıcısına uzaktan: 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

0

MongoDB Atlas kullanıcıları için çözüm!

--fieldsParametreyi çift tırnak içine alınmış virgülle ayrılmış alan adları olarak ekleyin :

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

Bu tam bir örnektir:

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>..."

0

Bu benim için çalışıyor Deneyin

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

Cmd'nin üstünde, filtre alanını istiyorsanız, kullanıcı koleksiyonunun tüm verilerini döndürür ve ardından --fields = e-posta, ad ekleyin


Bunun aşağıdaki cevaplardan farkı nedir?
Daniel W.

mongodump --host cluster0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / dokümanlar / db-12-2020 --authenticationDatabase admin --ssl - kullanıcı adınız - parola parolanızı deneyebilirsiniz bu da size tüm koleksiyonları verir.
manoj patel

-1

Bir hata ile sıkışıp kalan herkes için.

Size kısa bir açıklama ile bir çözüm vereyim: -

bağlanma komutu: -

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 -> Mongo sunucusunun ana bilgisayarı

--port -> Mongo sunucusunun bağlantı noktası

-u -> kullanıcı adı

-p -> şifre

--db -> ihracat yapmak istediğiniz db

--collection -> dışa aktarmak istediğiniz koleksiyon

--type -> benim durumumdaki CSV dışa aktarma türü

--out -> dışa aktarmak istediğiniz dosya adı

--fields -> dışa aktarmak istediğiniz tüm alanlar (CSV durumunda virgüller arasında iki alan adı arasında boşluk bırakmayın)

--authenticationDatabase -> tüm kullanıcı bilgilerinizin depolandığı veritabanı


-2

Koleksiyonu CSV formatına dışa aktarmak için aşağıdaki komut kullanılır.

Not: naagveritabanıdır, employee1_jsonbir koleksiyondur.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1

mongodb 4'ün geri dönüşü budur: Başarısız: CSV modu bir alan listesi gerektirir
CUMA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.