Answers:
--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 :
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
...简单:)
mongo --eval "db.version()" --quiet
例如,您可以避免打印所有您所说的噪音
将您的mongo脚本放入.js
文件中。
然后执行 mongo < yourFile.js
例如:
demo.js //文件包含您的脚本
use sample //db name
show collections
将此文件保存在“ c:\ db-scripts”中
然后在cmd提示符下转到“ c:\ db-scripts”
C:\db-scripts>mongo < demo.js
这将在mongo中执行代码并显示输出
C:\db-scripts>mongo < demo.js
Mongo shell version: 3.0.4
Connecting to: test
switched to db sample
users //collection name
tasks //collection name
bye
C:\db-scripts>
.js
文件中,并将其作为参数传递给该mongo
命令。
use dbName
并show dbs
从内部迅速而从壳里面的不工作.js
文件。非JavaScript命令具有等效的JavaScript,因此这不是限制,只是您需要注意的事项。
mongo dbName -u userName -p "password with spaces" scriptToRun.js
这在Linux下对我有效:
mongo < script.js
将其放在一个名为的文件中test.js
:
db.mycollection.findOne()
db.getCollectionNames().forEach(function(collection) {
print(collection);
});
然后用运行它mongo myDbName test.js
。
下面的shell脚本对我也很好用...肯定必须使用Antonin最初提到的重定向...这给了我测试此处文档的想法。
function testMongoScript {
mongo <<EOF
use mydb
db.leads.findOne()
db.leads.find().count()
EOF
}
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
。:-)
db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
等
我使用David Young提到的“ heredoc”语法。但是有一个问题:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
上面的命令不起作用,因为shell会看到短语“ $ exists”,并用名为“ exists”的环境变量的值代替。可能不存在,因此在shell扩展后,它变为:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
为了使它通过,您有两个选择。一个很丑,一个很不错。一,丑陋的一面:逃脱$符号:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
我不建议这样做,因为很容易忘记逃脱。
另一个选择是逃避EOF,如下所示:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
现在,您可以将所有所需的美元符号放入heredoc中,而美元符号将被忽略。不利的一面:如果您需要在mongo脚本中放入shell参数/变量,那将不起作用。
您可以使用的另一种选择是弄乱您的shebang。例如,
#!/bin/env mongo
<some mongo stuff>
此解决方案存在几个问题:
仅当您尝试从命令行使mongo shell脚本可执行时,它才有效。您不能将常规的shell命令与mongo shell命令混合使用。这样,您节省的所有事情都不必在命令行上键入“ mongo” ...(当然,这足够合理)
它的功能与“ mongo <some-js-file>”完全相同,这意味着它不允许您使用“ use <db>”命令。
我尝试过将数据库名称添加到shebang中,您认为这会起作用。不幸的是,系统处理shebang行的方式是,第一个空格之后的所有内容都作为单个参数(如被引用)传递给env命令,而env找不到并运行它。
相反,您必须将数据库更改嵌入脚本本身中,如下所示:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
就像生活中的一切一样,“有不止一种方法可以做到这一点!”
这个怎么样:
echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName
.mongorc
已经被加载(docs.mongodb.org/manual/reference/program/mongo/...)
mongo <<EOF
use <db_name>
db.getCollection("<collection_name>").find({})
EOF
--shell标志也可用于javascript文件
mongo --shell /path/to/jsfile/test.js
mongo /path/to/jsfile/test.js
也会执行js。
mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"
最近从mongodb迁移到Postgres。这就是我使用脚本的方式。
mongo < scripts.js > inserts.sql
阅读scripts.js
和输出重定向到inserts.sql
。
scripts.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), ";");
inserts.sql
看起来像这样
INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');
How to execute mongo commands through shell scripts?
这不是题外话。实际上,由于标题,我遇到了这个问题。所以像我这样的人受益于阅读这样的答案。另外,我在示例中提供了一个非常有用的方法,而不是玩具示例。
如果您想用一行处理它,这是一种简单的方法。
file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)
cat file.sh | mongo <EXPECTED_COLLECTION>
.find()
操作,您需要在结果对象上调用操作以打印文档,例如toArray()
或shellPrint()
。例如,mongo userdb --eval "printjson(db.users.find().toArray())"