Eu uso a sintaxe "heredoc", mencionada por David Young. Mas há um porém:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
O exemplo acima NÃO funcionará, porque a frase "$ existe" será vista pelo shell e substituída pelo valor da variável de ambiente denominada "existe". Como, provavelmente, não existe, então após a expansão do shell, ele se torna:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
Para que ele passe, você tem duas opções. Um é feio, um é bastante agradável. Primeiro, o feio: escape dos sinais de $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
Eu não recomendo isso, porque é fácil esquecer de escapar.
A outra opção é escapar do EOF, assim:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Agora, você pode colocar todos os cifrões que deseja em seu heredoc, e os cifrões são ignorados. O lado negativo: Isso não funciona se você precisar colocar parâmetros / variáveis do shell no seu script mongo.
Outra opção com a qual você pode brincar é mexer com seu shebang. Por exemplo,
#!/bin/env mongo
<some mongo stuff>
Existem vários problemas com esta solução:
Só funciona se você estiver tentando tornar um script mongo executável a partir da linha de comando. Você não pode misturar comandos regulares do shell com comandos mongo shell. E tudo o que você economiza ao fazer isso é não precisar digitar "mongo" na linha de comando ... (razão suficiente, é claro)
Funciona exatamente como "mongo <some-js-file>", o que significa que não permite que você use o comando "use <db>".
Tentei adicionar o nome do banco de dados ao shebang, o que você acha que funcionaria. Infelizmente, da maneira como o sistema processa a linha shebang, tudo após o primeiro espaço é passado como um único parâmetro (como se citado) para o comando env, e o env falha ao encontrá-lo e executá-lo.
Em vez disso, você deve incorporar a alteração do banco de dados no próprio script, da seguinte maneira:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Como em qualquer coisa na vida, "há mais de uma maneira de fazer isso!"
.find()
operações, você precisa chamar uma operação no objeto de resultado para imprimir os documentos, comotoArray()
oushellPrint()
. por exemplo,mongo userdb --eval "printjson(db.users.find().toArray())"