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

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

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

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


当前回答

最近从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');

其他回答

当使用复制集时,必须在PRIMARY上进行写操作,所以我通常使用这样的语法,以避免弄清楚哪个主机是主主机:

mongo -host myReplicaset/anyKnownReplica

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

#!/bin/sh
mongo < file.js

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

在file.js中编写mongo查询:

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

把它放在一个名为test.js的文件中:

db.mycollection.findOne()
db.getCollectionNames().forEach(function(collection) {
  print(collection);
});

然后用mongo myDbName test.js运行它。

在我的设置中,我必须使用:

mongo --host="the.server.ip:port" databaseName theScript.js 

mongodb的更新版本

mongosh --host="the.server.ip:port" databaseName theScript.js 

如果你想用一条线来处理它,这是一个简单的方法。

file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)

cat file.sh | mongo <EXPECTED_COLLECTION>