MongoDB文档here说:mongo STAR_WARS
连接到STAR_WARS
数据库。我想知道是否有可能传入您将在此命令中创建的不存在的数据库的名称。我专门尝试此命令,因为我的数据库是远程的。
CMD=$(cat <<EOF
if (db.getUsers({ usersInfo: "${MONGO_USER}" }) == 0) {
db.createUser({
user: "${MONGO_USER}",
pwd: "${MONGO_PASSWORD}",
roles: [{ role: "dbAdmin", db: "admin" }, "readWrite"],
passwordDigestor : "server"
});
}
EOF
)
mongo ${MONGO_ROOT_DSN} NEW_DB_NAME --eval "${CMD}"
MONGO_ROOT_DSN
的格式为mongodb://root:ROOT_PASSWORD@HOST:PORT/?authSource=admin
传入的CMD
可以在数据库中添加其他用户。
使用此命令,出现以下错误:
MongoDB shell version v3.4.4
connecting to: mongodb://root:ROOT_PASSWORD@HOST:PORT/?authSource=admin
MongoDB server version: 3.6.12
WARNING: shell and server versions do not match
2020-01-26T09:10:59.003+0000 E - [main] file [NEW_DB_NAME] doesn't exist
failed to load: NEW_DB_NAME
这种方法可行吗?还是必须连接外壳并使用use NEW_DB_NAME;
命令?我相信您不能在非交互式中使用use
命令(例如,在Docker容器中运行脚本)。因此,需要能够传递要创建的数据库的名称。
警告是引起此问题的原因还是与数据库地址格式有关?
为什么此NEW_DB_NAME被解释为文件名?文件名是什么?
答案 0 :(得分:1)
基于mongodb文档,您可以通过以下方式选择另一个数据库:
mongo mongodb://root:ROOT_PASSWORD@HOST:PORT/NEW_DB_NAME --eval "${CMD}"
此语法是连接到特定数据库的唯一方法。 (https://docs.mongodb.com/manual/reference/program/mongo/#cmdoption-mongo-arg-db)
否则,您将收到文件未找到错误,因为它将尝试执行JavaScript文件。 (https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell/#execute-a-javascript-file)
除了连接字符串之外,当角色选项中的信息指向“ admin”数据库时,为什么还要连接到另一个数据库?
roles: [{ role: "dbAdmin", db: "admin" }, "readWrite"]
您认为在JavaScript函数中使用'db.getSiblingDB(“ NEW_DB_NAME”)'作为替代方案是什么?
您可以使用db.getSiblingDB()作为使用帮助器的替代方法。当使用mongo shell编写脚本(其中没有使用帮助器)时,这特别有用。 (https://docs.mongodb.com/manual/reference/method/db.getSiblingDB/)