จะส่งออกคอลเลกชันเป็น CSV ใน MongoDB ได้อย่างไร


103

คุณจะส่งออกระเบียนทั้งหมดในคอลเลคชัน MongoDB ไปยัง.csvไฟล์ได้อย่างไร

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

สิ่งนี้ขอให้ฉันระบุชื่อของช่องที่ฉันต้องการส่งออก ฉันสามารถส่งออกฟิลด์ทั้งหมดโดยไม่ระบุชื่อฟิลด์ได้หรือไม่

คำตอบ:


116

@ karoly-horvath ได้เลยค่ะ ต้องระบุฟิลด์สำหรับ csv

ตามข้อผิดพลาดนี้ในฉบับติดตาม MongoDB https://jira.mongodb.org/browse/SERVER-4224 คุณจะต้องให้ฟิลด์เมื่อส่งออกไปยังไฟล์ CSV เอกสารไม่ชัดเจน นั่นคือสาเหตุของข้อผิดพลาด

ลองสิ่งนี้:

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

อัพเดท:

คอมมิตนี้: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398แก้ไขเอกสารสำหรับ 3.0.0-rc10 และใหม่กว่า มันเปลี่ยน

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

ถึง

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

เวอร์ชัน 3.0 ขึ้นไป:

คุณควรใช้--type=csvแทน--csvเนื่องจากเลิกใช้แล้ว

รายละเอียดเพิ่มเติม: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

คำสั่งเต็ม:

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

16
ในเวอร์ชัน 3.0.6 mongoexportกล่าวว่าcsv flag is deprecated; please use --type=csv instead
Roman Dibikhin

ขอขอบคุณ (ที่ไม่ระบุชื่อ) สำหรับการแก้ไขเวอร์ชัน 3.0 และด้านบน
campeterson

4
มีวิธีที่รวดเร็วในการรวมฟิลด์ทั้งหมดแทนที่จะตั้งชื่อแต่ละช่องหรือไม่?
Kevz

53

นอกจากนี้คุณไม่ได้รับอนุญาตให้เว้นวรรคระหว่างชื่อเขตข้อมูลที่คั่นด้วยจุลภาค

ไม่ดี: -f firstname, lastname

ดี: -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

คุณต้องระบุด้วยตนเองและถ้าคุณคิดเกี่ยวกับเรื่องนี้มันก็สมเหตุสมผลดี MongoDB เป็น schemaless; ในทางกลับกัน CSV มีรูปแบบคงที่สำหรับคอลัมน์ หากไม่ทราบว่ามีการใช้ฟิลด์ใดในเอกสารต่างๆจึงเป็นไปไม่ได้ที่จะส่งออกการถ่ายโอนข้อมูล CSV

หากคุณมีสคีมาคงที่บางทีคุณสามารถดึงเอกสารหนึ่งชุดได้ให้รวบรวมชื่อฟิลด์จากมันด้วยสคริปต์และส่งต่อไปยัง mongoexport


1
ฉันแค่ค้นหาว่าฉันสามารถรับรายการฟิลด์จากบันทึกได้หรือไม่ เช่นจาก db.collection.finOne (). getFields () แต่ฉันเดาว่านั่นไม่ใช่วิธีที่ถูกต้อง (getFields) ฉันลอง getKeys () ด้วย มิฉะนั้นฉันจะต้องได้รับบันทึกด้วยแฮชคีย์: ค่า
ประสบความสำเร็จ Stha

ฉันกำลังพยายามทำสิ่งเดียวกัน แต่หาสาเหตุไม่ได้ว่าทำไมจึงนำเข้าไฟล์ csv ไม่ถูกต้อง ในกรณีของฉันฉันต้องการให้มันบอกฉันทุกอย่างเกี่ยวกับตัวมันเองรวมถึงช่องใดที่มัน "คิดค้น" ขึ้นมาเอง ดังนั้นในกรณีของฉันมันไม่สมเหตุสมผลที่จะต้องระบุฟิลด์เพราะฉันไม่รู้ว่ามันคืออะไร!
Stephen

ที่ด้านหน้าสนามสคริปต์เก็บเกี่ยวผมโพสต์นี้หรือดังนั้นปีหลังอาจทำให้คุณคิดไม่กี่
arober11

9

หากต้องการคุณสามารถเอ็กซ์พอร์ตคอลเล็กชันทั้งหมดเป็น csv โดยไม่ต้องระบุ--fields(จะเอ็กซ์พอร์ตฟิลด์ทั้งหมด)

จากhttp://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/เรียกใช้สคริปต์ทุบตีนี้

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
ปัญหาเฉพาะกับสคริปต์ข้างต้นคือถือว่าเอกสารแรกในแต่ละคอลเลกชันมีคีย์ที่เป็นไปได้ทั้งหมดที่อาจปรากฏในเอกสารในคอลเล็กชันนั้น ซึ่งอาจไม่เป็นเช่นนั้นหากประเภทเอกสารสามารถมีอาร์เรย์หรือเอกสารย่อยที่ซ้อนกัน
arober11

@ arober11 คุณพูดถูกลืมพูดถึงข้อเท็จจริงที่สำคัญนี้ สิ่งที่ฉันมักจะทำคือเรียกใช้สคริปต์ลดแผนที่เพื่อรวบรวมคีย์ทั้งหมดเป็นระยะและใช้เพื่อดึงคีย์ทั้งหมด
Michael

3

ฉันไม่สามารถให้ mongoexport ทำสิ่งนี้ให้ฉันได้ ฉันพบว่าเพื่อให้ได้รายการฟิลด์ทั้งหมดอย่างละเอียดคุณต้องวนซ้ำคอลเลกชันทั้งหมดหนึ่งครั้ง ใช้สิ่งนี้เพื่อสร้างส่วนหัว จากนั้นวนซ้ำคอลเลกชันอีกครั้งเพื่อเติมข้อมูลส่วนหัวเหล่านี้สำหรับเอกสารแต่ละฉบับ

ฉันเขียนสคริปต์ให้ทำแค่นี้ การแปลงเอกสาร MongoDB เป็น csv โดยไม่คำนึงถึงความแตกต่างของสคีมาระหว่างเอกสารแต่ละฉบับ

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


2

นอกจากนี้หากคุณต้องการส่งออกฟิลด์ json ภายในให้ใช้ dot (. operator)

บันทึก JSON:

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

คำสั่ง mongoexport พร้อมตัวดำเนินการ dot (ใช้ mongo เวอร์ชัน 3.4.7):

./mongoexport - โฮสต์ localhost --db myDB --collection myColl --type = csv --out out.csv --fields value.deviceId, value.userIds

เอาต์พุต csv:

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

หมายเหตุ: ตรวจสอบว่าคุณไม่ได้ส่งออกอาร์เรย์ มันจะทำให้รูปแบบ CSV เสียหายเช่น userIds ฟิลด์ที่แสดงด้านบน


0

ทางออกสำหรับผู้ใช้ MongoDB Atlas!

เพิ่ม--fieldsพารามิเตอร์เป็นชื่อฟิลด์ที่คั่นด้วยเครื่องหมายจุลภาคที่อยู่ในเครื่องหมายคำพูดกลับหัวคู่:

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

นี่คือตัวอย่างที่สมบูรณ์:

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

สิ่งนี้ใช้ได้ผลสำหรับฉันลองดูสิ

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 ส่งคืนข้อมูลทั้งหมดของคอลเลกชันผู้ใช้หากคุณต้องการฟิลด์ตัวกรองจากนั้นเพิ่ม --fields = email, name


สิ่งนี้แตกต่างจากคำตอบด้านล่างอย่างไร?
Daniel W.

mongodump - โฮสต์คลัสเตอร์ 0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / documents / db-12-2020 --authenticationDatabase admin --ssl - ชื่อผู้ใช้ youruname - รหัสผ่านรหัสผ่านของคุณคุณสามารถลองใช้สิ่งนี้ยังช่วยให้คุณมีคอลเล็กชันทั้งหมด
manoj patel

0

ใช้งานได้กับฉันในระยะไกลไปยังคอนเทนเนอร์นักเทียบท่าด้วย 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

-1

สำหรับผู้ที่ติดขัดข้อผิดพลาด

ให้ฉันช่วยแก้ปัญหาด้วยคำอธิบายสั้น ๆ ในทำนองเดียวกัน: -

คำสั่งในการเชื่อมต่อ: -

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

- โฮสต์ -> โฮสต์ของเซิร์ฟเวอร์ Mongo

--port -> พอร์ตของเซิร์ฟเวอร์ Mongo

-u -> ชื่อผู้ใช้

-p -> รหัสผ่าน

--db -> db ที่คุณต้องการส่งออก

--collection -> คอลเล็กชันที่คุณต้องการส่งออก

--type -> ประเภทของการส่งออกในกรณีของฉัน CSV

--out -> ชื่อไฟล์ที่คุณต้องการส่งออก

--fields -> ฟิลด์ทั้งหมดที่คุณต้องการส่งออก (อย่าให้ช่องว่างระหว่างชื่อฟิลด์สองชื่อระหว่างเครื่องหมายจุลภาคในกรณีของ CSV)

--authenticationDatabase -> ฐานข้อมูลที่เก็บข้อมูลผู้ใช้ทั้งหมดของคุณ


-2

คำสั่งด้านล่างที่ใช้ในการส่งออกคอลเล็กชันเป็นรูปแบบ CSV

หมายเหตุ: naagเป็นฐานข้อมูลemployee1_jsonคือคอลเล็กชัน

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

นี่คือสิ่งที่ MongoDB 4 ผลตอบแทน: ล้มเหลว: โหมด CSV ต้องมีรายชื่อสนาม
FRIDDAY
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.