ฉันใช้ไวยากรณ์ "heredoc" ซึ่ง David Young กล่าวถึง แต่มีการจับ:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
ด้านบนจะไม่ทำงานเนื่องจากเชลล์ "$ มีอยู่" จะเห็นได้โดยเชลล์และแทนที่ด้วยค่าของตัวแปรสภาพแวดล้อมที่ชื่อ "มีอยู่" ซึ่งน่าจะเป็นไปไม่ได้ดังนั้นหลังจากการขยายตัวของเชลล์มันจะกลายเป็น:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
เพื่อให้มันผ่านคุณมีสองตัวเลือก หนึ่งน่าเกลียดหนึ่งค่อนข้างดี ครั้งแรกที่น่าเกลียด: หนีสัญญาณ $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
ฉันไม่แนะนำนี้เพราะมันง่ายที่จะลืมที่จะหลบหนี
ตัวเลือกอื่นคือการหลบหนี EOF เช่นนี้
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
ตอนนี้คุณสามารถใส่เครื่องหมายดอลลาร์ทั้งหมดที่คุณต้องการใน heredoc ของคุณและเครื่องหมายดอลลาร์จะถูกละเว้น ข้อเสีย: นั่นไม่ได้ผลถ้าคุณต้องการใส่พารามิเตอร์ / ตัวแปรเชลล์ในสคริปต์ Mongo ของคุณ
อีกทางเลือกหนึ่งที่คุณสามารถเล่นได้คือยุ่งกับ shebang ของคุณ ตัวอย่างเช่น,
#!/bin/env mongo
<some mongo stuff>
มีปัญหาหลายอย่างในการแก้ปัญหานี้:
ใช้งานได้เฉพาะในกรณีที่คุณพยายามสร้างเชลล์สคริปต์ mongo จากบรรทัดคำสั่ง คุณไม่สามารถผสมคำสั่งเชลล์ปกติกับคำสั่งเชลล์ mongo และสิ่งที่คุณบันทึกด้วยการทำเช่นนั้นไม่ต้องพิมพ์ "mongo" ในบรรทัดคำสั่ง ... (เหตุผลเพียงพอแน่นอน)
มันทำงานเหมือนกับ "mongo <some-js-file>" ซึ่งหมายความว่ามันจะไม่ยอมให้คุณใช้คำสั่ง "use <dput"
ฉันได้ลองเพิ่มชื่อฐานข้อมูลลงใน shebang ซึ่งคุณคิดว่าจะใช้งานได้ น่าเสียดายที่วิธีการที่ระบบประมวลผลบรรทัด shebang ทุกอย่างหลังจากที่เว้นวรรคแรกถูกส่งผ่านเป็นพารามิเตอร์เดียว (ราวกับว่าที่ยกมา) กับคำสั่ง env และ env ล้มเหลวในการค้นหาและเรียกใช้
คุณต้องฝังการเปลี่ยนแปลงฐานข้อมูลภายในสคริปต์แทนเช่น:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
เช่นเดียวกับสิ่งใดในชีวิต "มีมากกว่าหนึ่งวิธีที่จะทำ!"
.find()
การดำเนินงานคุณจะต้องเรียกการดำเนินการบนวัตถุผลในการพิมพ์เอกสารเช่นหรือtoArray()
shellPrint()
เช่นmongo userdb --eval "printjson(db.users.find().toArray())"