2017-10-09 2 views
1

Existe-t-il un moyen d'utiliser des variables shell dans une requête MongoDB?Utilisation de variables shell dans la requête MongoDB

J'ai ceci par exemple:

#!/usr/bin/env bash 

mongo --eval "use cdt_db; db.users.update({username:'${USER}'}, {'\$set':{roles:['Admin']}});" 

J'ai essayé des guillemets simples et doubles guillemets, je reçois cette erreur:

MongoDB shell version v3.4.9 
connecting to: mongodb://127.0.0.1:27017 
MongoDB server version: 3.4.9 
2017-10-09T13:53:51.747-0700 E QUERY [thread1] SyntaxError: missing ; before statement @(shell eval):1:4 
+0

Ne devrait pas '$ set' sans les guillemets? Le moyen le plus sûr serait d'écrire l'expression sous guillemets simples, en la concaténant avec des valeurs variables: 'mongo cdt_db --eval 'db.users.update ({nom d'utilisateur:"' "$ USER" '"}, {$ set: { rôles: ["Admin"]}}); – randomir

+1

oui cela semble fonctionner, si vous pouviez ajouter une réponse expliquer en détail, je vais donner un upvote à tout le moins –

+0

heureux de l'entendre. Je vais l'écrire. – randomir

Répondre

2

Du point de vue de la coquille, votre requête est très bien. La variable USER est développée correctement et $ dans $set est correctement échappée pour empêcher l'expansion des paramètres du shell.

Le problème est dans votre partie use <dbname> de la requête. Selon le docs:

You cannot use any shell helper (e.g. use <dbname>, show dbs, etc.) inside the JavaScript file because they are not valid JavaScript.

Au lieu de cela, vous pouvez utiliser un équivalent JavaScript:

db = db.getSiblingDB('<dbname>') 

ou, mieux encore, indiquez le nom de la base de données via argument de ligne de commande:

mongo dbname --eval 'query' 

Correction, votre requête ressemble à:

mongo cdt_db --eval "db.users.update({username:'${USER}'}, {\$set:{roles:['Admin']}});" 

Pour plus de commodité (moins échapper), parfois vous pourriez envisager également d'utiliser des guillemets simples et concaténer les variables étendues (sous guillemets):

mongo cdt_db --eval 'db.users.update({username:"'"${USER}"'"}, {$set:{roles:["Admin"]}});'