和Mongo一起2天,我有一个SQL背景所以请耐心等待.与mysql一样,在MySQL命令行中将查询结果输出到机器上的文件非常方便.我试图理解如何在shell中做同样的事情
我可以通过在shell之外并执行以下命令轻松获取我想要的查询的输出:
mongo localhost:27017/dbname --eval "printjson(db.collectionName.findOne())" >> sample.json
上面的方法很好,但它需要我退出mongo shell或打开一个新的终端选项卡来执行此命令.如果我可以在shell内部完成此操作,那将非常方便.
PS:问题是我在SO上发布的问题的一个分支
AFAIK,没有输出到文件的交互式选项,有一个先前的SO问题与此相关:打印mongodb shell输出到文件
但是,如果使用tee命令调用shell,则可以记录所有shell会话:
$ mongo | tee file.txt MongoDB shell version: 2.4.2 connecting to: test > printjson({this: 'is a test'}) { "this" : "is a test" } > printjson({this: 'is another test'}) { "this" : "is another test" } > exit bye
然后你会得到一个包含这个内容的文件:
MongoDB shell version: 2.4.2 connecting to: test > printjson({this: 'is a test'}) { "this" : "is a test" } > printjson({this: 'is another test'}) { "this" : "is another test" } > exit bye
要删除所有命令并仅保留json输出,可以使用类似于的命令:
tail -n +3 file.txt | egrep -v "^>|^bye" > output.json
然后你会得到:
{ "this" : "is a test" } { "this" : "is another test" }
如果使用script-file,db address和--quiet参数调用shell,则可以将输出(例如print())重定向到文件:
mongo localhost/mydatabase --quiet myScriptFile.js > output
我们可以这样做 -
mongo db_name --quiet --eval 'DBQuery.shellBatchSize = 2000; db.users.find({}).limit(2000)' > users.json
该shellBatchSize
参数用于确定允许打印的mongo客户端的行数.它的默认值是20.
写JS文件蒙戈查询,并从终端发送
切换/编程的方式定义一个数据库
输出所有找到的记录
切断初始输出线
将输出保存到JSON文件
myScriptFile.js
// Switch current database to "mydatabase" db = db.getSiblingDB('mydatabase'); // The mark for cutting initial output off print("CUT_TO_HERE"); // Main output // "toArray()" method allows to get all records printjson( db.getCollection('jobs').find().toArray() );
从终端发送查询
-z
键sed
允许将输出视为单个多行字符串
$> mongo localhost --quiet myScriptFile.js | sed -z 's/^.*CUT_TO_HERE\n//' > output.json