Tôi sử dụng cú pháp "heredoc", mà David Young đề cập. Nhưng có một nhược điểm:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Ở trên sẽ KHÔNG hoạt động, bởi vì cụm từ "$ tồn tại" sẽ được nhìn thấy bởi shell và được thay thế bằng giá trị của biến môi trường có tên "tồn tại". Mà, có khả năng, không tồn tại, vì vậy sau khi mở rộng vỏ, nó trở thành:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
Để có nó đi qua bạn có hai lựa chọn. Một là xấu xí, một là khá tốt đẹp. Đầu tiên, cái xấu nhất: thoát khỏi dấu $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
Tôi KHÔNG khuyên bạn điều này, vì nó rất dễ quên để trốn thoát.
Tùy chọn khác là thoát EOF, như thế này:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Bây giờ, bạn có thể đặt tất cả các ký hiệu đô la bạn muốn trong di sản của mình và các ký hiệu đô la bị bỏ qua. Mặt trái: Điều đó không hoạt động nếu bạn cần đặt các tham số / biến shell trong tập lệnh mongo của mình.
Một lựa chọn khác bạn có thể chơi với là gây rối với shebang của bạn. Ví dụ,
#!/bin/env mongo
<some mongo stuff>
Có một số vấn đề với giải pháp này:
Nó chỉ hoạt động nếu bạn đang cố gắng tạo một kịch bản shell mongo có thể thực thi được từ dòng lệnh. Bạn không thể trộn các lệnh shell thông thường với các lệnh shell mongo. Và tất cả những gì bạn lưu bằng cách làm như vậy là không phải gõ "mongo" trên dòng lệnh ... (tất nhiên là đủ lý do)
Nó hoạt động chính xác như "mongo <some-js-file>" có nghĩa là nó không cho phép bạn sử dụng lệnh "use <db>".
Tôi đã thử thêm tên cơ sở dữ liệu vào shebang, cái mà bạn nghĩ sẽ hoạt động. Thật không may, cách hệ thống xử lý dòng shebang, mọi thứ sau khi khoảng trống đầu tiên được truyền dưới dạng một tham số duy nhất (như được trích dẫn) cho lệnh env và env không tìm thấy và chạy nó.
Thay vào đó, bạn phải nhúng thay đổi cơ sở dữ liệu trong chính tập lệnh, như vậy:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Như với bất cứ điều gì trong cuộc sống, "có nhiều hơn một cách để làm điều đó!"
.find()
thao tác, bạn cần gọi một thao tác trên đối tượng kết quả để in các tài liệu, chẳng hạn nhưtoArray()
hoặcshellPrint()
. ví dụ:mongo userdb --eval "printjson(db.users.find().toArray())"