Uso la sintaxis "heredoc", que menciona David Young. Pero hay una trampa:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Lo anterior NO funcionará, porque la frase "$ existe" será vista por el shell y sustituida con el valor de la variable de entorno llamada "existe". Lo cual, probablemente, no existe, por lo que después de la expansión de shell, se convierte en:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
Para que pase, tienes dos opciones. Uno es feo, uno es bastante agradable. Primero, el feo: escapar de los signos $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
NO recomiendo esto, porque es fácil olvidar escapar.
La otra opción es escapar del EOF, así:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Ahora, puede poner todos los signos de dólar que desee en su heredoc, y los signos de dólar se ignoran. El lado negativo: eso no funciona si necesita poner parámetros / variables de shell en su script mongo.
Otra opción con la que puedes jugar es meterse con tu shebang. Por ejemplo,
#!/bin/env mongo
<some mongo stuff>
Hay varios problemas con esta solución:
Solo funciona si intenta hacer que un script de shell mongo sea ejecutable desde la línea de comandos. No puede mezclar comandos de shell normales con comandos de shell mongo. Y todo lo que ahorra al hacerlo es no tener que escribir "mongo" en la línea de comando ... (razón suficiente, por supuesto)
Funciona exactamente como "mongo <some-js-file>", lo que significa que no le permite usar el comando "use <db>".
Intenté agregar el nombre de la base de datos al shebang, que pensarías que funcionaría. Desafortunadamente, la forma en que el sistema procesa la línea shebang, todo después del primer espacio se pasa como un solo parámetro (como si fuera citado) al comando env, y env no puede encontrarlo ni ejecutarlo.
En cambio, debe incrustar el cambio de la base de datos dentro del script en sí, así:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Como con cualquier cosa en la vida, "¡hay más de una forma de hacerlo!"
.find()
operaciones, debe llamar a una operación en el objeto de resultado para imprimir los documentos, comotoArray()
oshellPrint()
. por ejemplo,mongo userdb --eval "printjson(db.users.find().toArray())"