在MongoDB查询中使用shell变量

时间:2017-10-09 20:55:25

标签: bash mongodb shell mongodb-query zsh

有没有办法在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

1 个答案:

答案 0 :(得分:2)

从shell的角度来看,您的查询很好。变量USER已正确扩展,并且$中的$set已正确转义,以防止shell参数扩展。

问题出在查询的use <dbname>部分。根据{{​​3}}:

  

无法在JavaScript中使用任何shell帮助程序(例如 use <dbname> show dbs 等)文件,因为它们不是有效的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"]}});'