2017-10-09 132 views
1

有沒有在MongoDB查詢中使用shell變量的方法?在MongoDB查詢中使用shell變量

我有這樣的例子:

#!/usr/bin/env bash 

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

我想單引號和雙引號,我得到這個錯誤:

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

不應該'$ set'是不帶引號?最安全的方法是將表達式寫在單引號下,並將它與變量值連接:'mongo cdt_db --eval'db.users.update({username:''「$ USER」'「},{$ set:{作用:[ 「系統管理員」]}});''。 – randomir

+1

是的,這似乎工作,如果你可以添加一個答案詳細解釋,我會給予upvote至少 –

+0

很高興聽到它。我會寫出來。 – randomir

回答

2

從外殼的角度來看,您的查詢是好的。變量USER已正確擴展,並且$set中的$已正確轉義以防止shell參數擴展。

問題在於您的use <dbname>部分查詢。按照docs

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

相反,你可以使用JavaScript等價的:

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

,或者更好的,通過命令行參數指定數據庫的名稱:

mongo dbname --eval 'query' 

已修復,您的查詢看起來像:

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

爲了方便(少逃逸),你可能有時也可以考慮使用單引號,並連接擴展變量(在雙引號):

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