2017-10-09 96 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"]}});'