J'utilise la syntaxe "heredoc", que David Young mentionne. Mais il ya un hic:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Ce qui précède ne fonctionnera PAS, car l'expression «$ existe» sera vue par le shell et remplacée par la valeur de la variable d'environnement nommée «existe». Ce qui, probablement, n'existe pas, donc après l'expansion du shell, cela devient:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
Pour le faire passer, vous avez deux options. On est moche, on est plutôt sympa. Tout d'abord, le laid: échapper aux signes $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
Je ne le recommande PAS, car il est facile d'oublier de s'échapper.
L'autre option est d'échapper à l'EOF, comme ceci:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Maintenant, vous pouvez mettre tous les signes dollar que vous souhaitez dans votre hérédoc, et les signes dollar sont ignorés. L'inconvénient: cela ne fonctionne pas si vous devez mettre des paramètres / variables shell dans votre script mongo.
Une autre option avec laquelle vous pouvez jouer est de jouer avec votre shebang. Par exemple,
#!/bin/env mongo
<some mongo stuff>
Il y a plusieurs problèmes avec cette solution:
Cela ne fonctionne que si vous essayez de rendre un script shell mongo exécutable à partir de la ligne de commande. Vous ne pouvez pas mélanger des commandes shell standard avec des commandes shell mongo. Et tout ce que vous économisez en le faisant, c'est de ne pas avoir à taper "mongo" sur la ligne de commande ... (raison suffisante, bien sûr)
Il fonctionne exactement comme "mongo <some-js-file>" ce qui signifie qu'il ne vous permet pas d'utiliser la commande "use <db>".
J'ai essayé d'ajouter le nom de la base de données au shebang, ce qui pourrait fonctionner. Malheureusement, la façon dont le système traite la ligne shebang, tout ce qui se trouve après le premier espace est passé en tant que paramètre unique (comme s'il était cité) à la commande env, et env ne parvient pas à le trouver et à l'exécuter.
Au lieu de cela, vous devez intégrer la modification de la base de données dans le script lui-même, comme ceci:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Comme pour tout dans la vie, "il y a plus d'une façon de le faire!"
.find()
opérations, vous devez appeler une opération sur l'objet résultat pour imprimer les documents, tels quetoArray()
oushellPrint()
. par exemple,mongo userdb --eval "printjson(db.users.find().toArray())"