我想在shell脚本中执行mongo命令,例如在脚本test.sh中:

#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections

当我通过./test.sh执行这个脚本时,会建立到MongoDB的连接,但不会执行以下命令。

如何通过shell脚本test.sh执行其他命令?


当前回答

你也可以使用——eval标志对命令求值,如果它只是一个命令的话。

mongo --eval "printjson(db.serverStatus())"

请注意:如果你使用Mongo操作符,以$符号开始,你需要用单引号包围eval参数,以防止shell将操作符作为环境变量来计算:

mongo --eval 'db.mycollection.update({"name":"foo"},{$set:{"this":"that"}});' myDbName

否则你可能会看到这样的东西:

mongo --eval "db.test.update({\"name\":\"foo\"},{$set:{\"this\":\"that\"}});"
> E QUERY    SyntaxError: Unexpected token :

其他回答

创建一个脚本文件;写命令:

#!/bin/sh
mongo < file.js

对于更新的版本 Mongosh < file.js

在file.js中编写mongo查询:

db.collection.find({"myValue":null}).count();

最近从mongodb迁移到Postgres。这是我使用脚本的方式。

mongo < scripts.js > inserts.sql

读取scripts.js,输出重定向到inserts.sql。

js看起来像这样

use myDb;
var string = "INSERT INTO table(a, b) VALUES";
db.getCollection('collectionName').find({}).forEach(function (object) {
    string += "('" + String(object.description) + "','" + object.name + "'),";
});
print(string.substring(0, string.length - 1), ";");

插入。SQL看起来像这样

INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');

下面的shell脚本也很适合我……definite不得不使用Antonin一开始提到的重定向…这让我产生了测试这里文档的想法。

function testMongoScript {
    mongo <<EOF
    use mydb
    db.leads.findOne()
    db.leads.find().count()
EOF
}

关于这一点也有一个官方文档页面。

该页面的例子包括:

mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"

如果您已启用身份验证:

mongo -u username -p password --authenticationDatabase auth_db_name < your_script.js

更新版本

mongosh -u username -p password --authenticationDatabase auth_db_name < your_script.js