โดยเฉพาะฉันต้องการพิมพ์ผลลัพธ์ของ mongodb find()
ลงในไฟล์ ออบเจ็กต์ JSON มีขนาดใหญ่เกินไปฉันจึงไม่สามารถดูวัตถุทั้งหมดด้วยขนาดหน้าต่างเชลล์ได้
โดยเฉพาะฉันต้องการพิมพ์ผลลัพธ์ของ mongodb find()
ลงในไฟล์ ออบเจ็กต์ JSON มีขนาดใหญ่เกินไปฉันจึงไม่สามารถดูวัตถุทั้งหมดด้วยขนาดหน้าต่างเชลล์ได้
คำตอบ:
เปลือกมีคุณสมบัติที่ดี แต่ซ่อนอยู่เนื่องจากเป็นสภาพแวดล้อมแบบโต้ตอบ
เมื่อคุณเรียกใช้คำสั่งจากไฟล์จาวาสคริปต์ผ่าน 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
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
เนื่องจากคุณกำลังทำสิ่งนี้บนเครื่องเทอร์มินัลและเพียงแค่ต้องการตรวจสอบบันทึกด้วยวิธีที่มีเหตุผลคุณสามารถใช้เคล็ดลับดังนี้:
mongo | tee somefile
ใช้เซสชันตามปกติ - db.collection.find().pretty()
หรืออะไรก็ตามที่คุณต้องทำละเว้นเอาต์พุตแบบยาวและออก การถอดเสียงของเซสชันของคุณจะอยู่ในไฟล์ที่tee
เขียนถึง
โปรดทราบว่าผลลัพธ์อาจมีลำดับการหลีกเลี่ยงและขยะอื่น ๆ เนื่องจาก mongo shell คาดว่าจะมีเซสชันแบบโต้ตอบ less
จัดการสิ่งเหล่านี้อย่างสง่างาม
เพียงใส่คำสั่งที่คุณต้องการเรียกใช้ลงในไฟล์จากนั้นส่งไปยังเชลล์พร้อมกับชื่อฐานข้อมูลและเปลี่ยนทิศทางผลลัพธ์ไปยังไฟล์ ดังนั้นหากคำสั่ง find ของคุณอยู่ในfind.js
และฐานข้อมูลของคุณfoo
ก็จะมีลักษณะดังนี้:
./mongo foo find.js >> out.json
out.json
ถึง mongo foo < find.js > out.json
ได้ผล
ใส่คำค้นหาของคุณ (เช่นdb.someCollection.find().pretty()
) query.js
ไปยังไฟล์จาวาสคริปต์สมมติว่า จากนั้นเรียกใช้ในเชลล์ของระบบปฏิบัติการของคุณโดยใช้คำสั่ง:
mongo yourDb < query.js > outputFile
ผลการค้นหาจะอยู่ในไฟล์ชื่อ 'outputFile'
ตามค่าเริ่มต้น Mongo จะพิมพ์เอกสาร IIRC 20 ชุดแรก หากคุณต้องการมากกว่านี้คุณสามารถกำหนดค่าใหม่ให้กับขนาดแบทช์ใน Mongo shell ได้เช่น
DBQuery.shellBatchSize = 100
.
.js
นามสกุลผิด คุณสามารถเขียนแบบสอบถามเปลือก mongo ที่ดีทั้งหมดได้โดยไม่ต้องเปลี่ยนแปลงเลย
การใช้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()
);
หวังว่านี่จะช่วยได้!
ใช้คำตอบนี้จาก Asya Kamsky ฉันเขียนสคริปต์ค้างคาวบรรทัดเดียวสำหรับ Windows เส้นมีลักษณะดังนี้:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
จากนั้นสามารถเรียกใช้งานได้:
exportToJson.bat DbName CollectionName
ฉันจัดการเพื่อบันทึกผลกับWriteFile ()ฟังก์ชั่น
> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))
Mongo shell เวอร์ชัน 4.0.9
นอกจากนี้ยังมีmongoexportสำหรับสิ่งนั้น แต่ฉันไม่แน่ใจว่ามันมีรุ่นไหน
ตัวอย่าง:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
ตามคำตอบของ Neodan mongoexport ค่อนข้างมีประโยชน์กับ-q
ตัวเลือกสำหรับแบบสอบถาม นอกจากนี้ยังแปลงObjectId
เป็นรูปแบบมาตรฐานของ "$oid"
JSON เช่น:
mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
คุณสามารถใช้คำสั่งนี้เพื่อบรรลุ:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json