Eu quero executar mongo
comandos no shell script, por exemplo, em um script test.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
Quando executo esse script via ./test.sh
, a conexão com o MongoDB é estabelecida, mas os seguintes comandos não são executados.
Como executar outros comandos através do shell script test.sh
?
.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())"
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
... simples :)mongo --eval "db.version()" --quiet
por exemplo, para evitar imprimir todo o ruído que você diz #Coloque seu script mongo em um
.js
arquivo.Então execute
mongo < yourFile.js
Ex:
demo.js // arquivo possui seu script
mantenha esse arquivo em "c: \ db-scripts"
Em seguida, no prompt do cmd, vá para "c: \ db-scripts"
Isso executará o código no mongo e mostra a saída
fonte
.js
arquivo e os passa como parâmetro para omongo
comando.use dbName
eshow dbs
vai trabalhar a partir do shell pronta interna, mas não de dentro de um.js
arquivo. Existem equivalentes JavaScript para os comandos não JavaScript, portanto, isso não é uma limitação, apenas algo que você precisa conhecer.mongo dbName -u userName -p "password with spaces" scriptToRun.js
Isso funciona para mim no Linux:
fonte
Coloque isso em um arquivo chamado
test.js
:depois execute-o com
mongo myDbName test.js
.fonte
Há uma página de documentação oficial sobre isso também.
Exemplos dessa página incluem:
fonte
O script de shell abaixo também funcionou bem para mim ... definitivamente tive que usar o redirecionamento que Antonin mencionou a princípio ... que me deu a ideia de testar o documento aqui.
fonte
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
. :-)db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
etc.Na minha configuração eu tenho que usar:
fonte
Eu uso a sintaxe "heredoc", mencionada por David Young. Mas há um porém:
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:
Para que ele passe, você tem duas opções. Um é feio, um é bastante agradável. Primeiro, o feio: escape dos sinais de $:
Eu não recomendo isso, porque é fácil esquecer de escapar.
A outra opção é escapar do EOF, assim:
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,
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:
Como em qualquer coisa na vida, "há mais de uma maneira de fazer isso!"
fonte
Caso você tenha a autenticação ativada:
fonte
Crie um arquivo de script; comandos de gravação:
Na
file.js
gravação sua consulta mongo:fonte
Que tal agora:
fonte
.mongorc
foi carregado ( docs.mongodb.org/manual/reference/program/mongo/... )Conforme sugerido por
theTuxRacer
, você pode usar o comando eval , para aqueles que o estão perdendo como eu, você também pode adicionar seu nome de banco de dados se não estiver tentando executar a operação no banco de dados padrão.fonte
Obrigado
printf
! Em um ambiente Linux, eis uma maneira melhor de ter apenas um arquivo executando o programa. Digamos que você tenha dois arquivos,mongoCmds.js
com vários comandos:e então o arquivo do shell do driver,
runMongoCmds.sh
Em vez disso, tenha apenas um arquivo, runMongoCmds.sh contendo
O Bash's
printf
é muito mais robustoecho
e permite que os\n
comandos entre eles os forcem em várias linhas.fonte
fonte
No meu caso, eu posso usar convenientemente
\n
como separador para o próximo comando mongo que quero executar e canalizá-los paramongo
fonte
O sinalizador --shell também pode ser usado para arquivos javascript
fonte
mongo /path/to/jsfile/test.js
também executará o js.fonte
Migrado recentemente do mongodb para o Postgres. Foi assim que usei os scripts.
Leia o
scripts.js
redirecionamento e output parainserts.sql
.scripts.js
se parece com issoinserts.sql
se parece com issofonte
How to execute mongo commands through shell scripts?
Isso não está fora do tópico. De fato, cheguei a essa pergunta devido ao título. Então, pessoas como eu se beneficiam lendo essa resposta. Além disso, estou fornecendo um método muito útil no exemplo, em vez de um exemplo de brinquedo.Se você quiser lidar com isso com uma linha, é uma maneira fácil.
fonte
Eu escrevi as várias opções para executar um Shell Script Mongo de dentro de um script maior Bash
fonte
Solução de script de shell único com capacidade de passar argumentos mongo (
--quiet
, dbname, etc):O
-S
sinalizador pode não funcionar em todas as plataformas.fonte
Ao usar um replicaset, as gravações devem ser feitas no PRIMARY, portanto, geralmente uso uma sintaxe como essa, que evita ter que descobrir qual host é o mestre:
mongo -host myReplicaset/anyKnownReplica
fonte