Używam składni „heredoc”, o której wspomina David Young. Ale jest w tym haczyk:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Powyższe NIE zadziała, ponieważ wyrażenie „$ istnieje” będzie widziane przez powłokę i podstawione wartością zmiennej środowiskowej o nazwie „istnieje”. Co prawdopodobnie nie istnieje, więc po rozszerzeniu powłoki staje się:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
Aby przejść, masz dwie opcje. Jeden jest brzydki, drugi jest całkiem fajny. Po pierwsze, brzydka: uciec od znaków $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
NIE polecam tego, ponieważ łatwo jest zapomnieć o ucieczce.
Inną opcją jest ucieczka przed EOF, tak jak to:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Teraz możesz umieścić wszystkie znaki dolara w swoim heredoc, a znaki dolara są ignorowane. Wada: To nie działa, jeśli musisz umieścić parametry / zmienne powłoki w skrypcie mongo.
Inną opcją, z którą możesz grać, jest bałagan z shebangiem. Na przykład,
#!/bin/env mongo
<some mongo stuff>
Istnieje kilka problemów z tym rozwiązaniem:
Działa to tylko wtedy, gdy próbujesz wykonać skrypt powłoki mongo jako wykonywalny z wiersza poleceń. Nie można łączyć zwykłych poleceń powłoki z poleceniami powłoki mongo. I jedyne, co oszczędzasz, robiąc to, nie musisz wpisywać „mongo” w wierszu poleceń ... (oczywiście wystarczający powód)
Działa dokładnie jak „mongo <some-js-file>”, co oznacza, że nie pozwala na użycie polecenia „use <db>”.
Próbowałem dodać nazwę bazy danych do shebang, co według ciebie byłoby skuteczne. Niestety, sposób, w jaki system przetwarza linię shebang, wszystko po pierwszym spacji jest przekazywane jako pojedynczy parametr (jak w cudzysłowie) do polecenia env, a env nie może go znaleźć i uruchomić.
Zamiast tego musisz osadzić zmianę bazy danych w samym skrypcie, tak:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Jak w przypadku wszystkiego w życiu, „istnieje więcej niż jeden sposób, aby to zrobić!”
.find()
operacji należy wywołać operację na obiekcie wynikowym, aby wydrukować dokumenty, takie jaktoArray()
lubshellPrint()
. np.mongo userdb --eval "printjson(db.users.find().toArray())"