มีวิธี 'สวย' พิมพ์ผลลัพธ์เปลือก MongoDB ไปยังไฟล์หรือไม่?


102

โดยเฉพาะฉันต้องการพิมพ์ผลลัพธ์ของ mongodb find()ลงในไฟล์ ออบเจ็กต์ JSON มีขนาดใหญ่เกินไปฉันจึงไม่สามารถดูวัตถุทั้งหมดด้วยขนาดหน้าต่างเชลล์ได้

คำตอบ:


217

เปลือกมีคุณสมบัติที่ดี แต่ซ่อนอยู่เนื่องจากเป็นสภาพแวดล้อมแบบโต้ตอบ

เมื่อคุณเรียกใช้คำสั่งจากไฟล์จาวาสคริปต์ผ่าน mongo commands.js คุณจะไม่ได้รับพฤติกรรมที่เหมือนกัน

มีสองวิธีรอบนี้

(1) ปลอมเปลือกและทำให้คิดว่าคุณอยู่ในโหมดโต้ตอบ

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF

หรือ
(2) ใช้ Javascript เพื่อแปลผลลัพธ์ของ a find()เป็น JSON ที่พิมพ์ได้

mongo dbname command.js > output.json

โดยที่ command.js มีสิ่งนี้ (หรือเทียบเท่า):

printjson( db.collection.find().toArray() )

สิ่งนี้จะพิมพ์อาร์เรย์ของผลลัพธ์ได้อย่างสวยงามรวมถึง[ ]- หากคุณไม่ต้องการให้คุณสามารถทำซ้ำในอาร์เรย์และprintjson()แต่ละองค์ประกอบได้

อย่างไรก็ตามหากคุณใช้คำสั่ง Javascript เพียงคำสั่งเดียวคุณไม่จำเป็นต้องใส่ไว้ในไฟล์และคุณสามารถใช้:

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json

command.js ต้องเป็นไฟล์ที่อ่านได้ซึ่งมีอยู่ในไดเร็กทอรีปัจจุบันของคุณและไฟล์ใดที่มีจาวาสคริปต์ที่คุณต้องการเรียกใช้
Asya Kamsky

ฉันจะทำมันเพื่อ db mongo ระยะไกลได้อย่างไร ฉันพยายามแต่มันทำให้ผมmongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
Sheharyar

ข้อผิดพลาดนั้นหมายความว่าสิ่งที่อยู่ในคำพูดของคุณหลังจาก --eval ไม่ใช่ไวยากรณ์ทางกฎหมาย ฉันขอแนะนำให้ใช้เครื่องหมายคำพูดเดี่ยวนอกนิพจน์ทั้งหมดและหากคุณต้องการคำพูดภายในให้ใช้เครื่องหมายคำพูดคู่สำหรับสิ่งนั้น
Asya Kamsky

2
ตัวเลือกที่ 2 เป็นเพียงตัวเลือกเดียวหากคุณมีผลลัพธ์มากกว่าจำนวนหนึ่งเนื่องจากในตัวเลือกที่ 1 จะหยุดอยู่ที่ "พิมพ์" เพื่อดูข้อมูลเพิ่มเติม "
Tomty

2
ไม่ใช่ @Tomty - ขนาดของชุดเชลล์สามารถควบคุมได้ด้วยตัวแปรภายในเชลล์ คุณสามารถใส่ DBQuery.shellBatchSize = 10000 ลงในไฟล์ .mongodbrc.js ของคุณและมันจะ "หยุด" หลังจาก 10,000 ผลลัพธ์แทนที่จะเป็น 20
Asya Kamsky

30

เนื่องจากคุณกำลังทำสิ่งนี้บนเครื่องเทอร์มินัลและเพียงแค่ต้องการตรวจสอบบันทึกด้วยวิธีที่มีเหตุผลคุณสามารถใช้เคล็ดลับดังนี้:

mongo | tee somefile

ใช้เซสชันตามปกติ - db.collection.find().pretty()หรืออะไรก็ตามที่คุณต้องทำละเว้นเอาต์พุตแบบยาวและออก การถอดเสียงของเซสชันของคุณจะอยู่ในไฟล์ที่teeเขียนถึง

โปรดทราบว่าผลลัพธ์อาจมีลำดับการหลีกเลี่ยงและขยะอื่น ๆ เนื่องจาก mongo shell คาดว่าจะมีเซสชันแบบโต้ตอบ lessจัดการสิ่งเหล่านี้อย่างสง่างาม


13

เพียงใส่คำสั่งที่คุณต้องการเรียกใช้ลงในไฟล์จากนั้นส่งไปยังเชลล์พร้อมกับชื่อฐานข้อมูลและเปลี่ยนทิศทางผลลัพธ์ไปยังไฟล์ ดังนั้นหากคำสั่ง find ของคุณอยู่ในfind.jsและฐานข้อมูลของคุณfooก็จะมีลักษณะดังนี้:

./mongo foo find.js >> out.json

นี้ไม่ได้ผลสำหรับฉันพิมพ์เดียวที่ออกรุ่นเปลือกและชื่อ dB out.jsonถึง mongo foo < find.js > out.jsonได้ผล
James Brown

1
คำตอบนี้เขียนขึ้นก่อนที่เครื่องมือจะถูกเขียนใหม่ใน Go และหลายเวอร์ชันที่ผ่านมาเว้นแต่คุณจะใช้สิ่งที่เก่ามากนั่นอาจเป็นเหตุผลว่าทำไมมันถึงไม่เหมาะกับคุณ
Adam Comerford

11

ใส่คำค้นหาของคุณ (เช่นdb.someCollection.find().pretty()) query.jsไปยังไฟล์จาวาสคริปต์สมมติว่า จากนั้นเรียกใช้ในเชลล์ของระบบปฏิบัติการของคุณโดยใช้คำสั่ง:

mongo yourDb < query.js > outputFile

ผลการค้นหาจะอยู่ในไฟล์ชื่อ 'outputFile'

ตามค่าเริ่มต้น Mongo จะพิมพ์เอกสาร IIRC 20 ชุดแรก หากคุณต้องการมากกว่านี้คุณสามารถกำหนดค่าใหม่ให้กับขนาดแบทช์ใน Mongo shell ได้เช่น

DBQuery.shellBatchSize = 100.


นี้. อย่าใช้.jsนามสกุลผิด คุณสามารถเขียนแบบสอบถามเปลือก mongo ที่ดีทั้งหมดได้โดยไม่ต้องเปลี่ยนแปลงเลย
ค.ศ.

5

การใช้printและJSON.stringifyคุณสามารถสร้างผลลัพธ์ที่ถูกต้อง JSONได้
ใช้--quietแฟล็กเพื่อกรองสัญญาณรบกวนเชลล์จากเอาต์พุต
ใช้--norcแฟล็กเพื่อหลีกเลี่ยง.mongorc.jsการประเมิน (ฉันต้องทำเพราะฟอร์แมตเตอร์สวย ๆ ที่ฉันใช้ซึ่งสร้างเอาต์พุตJSON ที่ไม่ถูกต้อง ) ใช้การDBQuery.shellBatchSize = ?แทนที่?ด้วยขีด จำกัด ของผลลัพธ์จริงเพื่อหลีกเลี่ยงการเพจ

และสุดท้ายใช้teeเพื่อไพพ์เอาต์พุตเทอร์มินัลไปยังไฟล์:

// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json

// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
  print(JSON.stringify(data, null, 2));
}

toPrint(
  db.getCollection('myCollection').find().toArray()
);

หวังว่านี่จะช่วยได้!


2

ใช้คำตอบนี้จาก Asya Kamsky ฉันเขียนสคริปต์ค้างคาวบรรทัดเดียวสำหรับ Windows เส้นมีลักษณะดังนี้:

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

จากนั้นสามารถเรียกใช้งานได้:

exportToJson.bat DbName CollectionName


2

ฉันจัดการเพื่อบันทึกผลกับWriteFile ()ฟังก์ชั่น

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Mongo shell เวอร์ชัน 4.0.9


1

นอกจากนี้ยังมีmongoexportสำหรับสิ่งนั้น แต่ฉันไม่แน่ใจว่ามันมีรุ่นไหน

ตัวอย่าง:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json

0

ตามคำตอบของ Neodan mongoexport ค่อนข้างมีประโยชน์กับ-qตัวเลือกสำหรับแบบสอบถาม นอกจากนี้ยังแปลงObjectIdเป็นรูปแบบมาตรฐานของ "$oid"JSON เช่น:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

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