Mongodb mongo脚本中的文件写入操作?
是否可以从mongo js脚本将查询结果写入文件。我找了很多,但没有找到任何解决办法 例:-Mongodb mongo脚本中的文件写入操作?,mongodb,Mongodb,是否可以从mongo js脚本将查询结果写入文件。我找了很多,但没有找到任何解决办法 例:- cursor=db.users.find(); while(cursor.hasNext()){ cursor.next(); //将光标输出写入文件??? } 对于通用语言(如Python、Ruby、Java等)使用其中一种,并以您可以使用的格式(如CSV等)将结果写入文件,不是更简单吗 更新:根据文档,您可以通过查询导出集合: $ ./mongodump --db blog --collection
cursor=db.users.find();
while(cursor.hasNext()){
cursor.next();
//将光标输出写入文件???
}
对于通用语言(如Python、Ruby、Java等)使用其中一种,并以您可以使用的格式(如CSV等)将结果写入文件,不是更简单吗
更新:根据文档,您可以通过查询导出集合:
$ ./mongodump --db blog --collection posts
-q '{"created_at" : { "$gte" : {"$date" : 1293868800000},
"$lt" : {"$date" : 1296460800000}
}
}'
但是,您需要将该集合导入MongoDB以对其进行操作,或者使用与
mongodump
相同的查询标志(-q
)将其导出为JSON或CSV。您可以使用打印,然后重定向输出:
script.js:
cursor = db.users.find();
while(cursor.hasNext()){
printjson(cursor.next());
}
然后运行脚本并将输出重定向到文件:
mongo --quiet script.js > result.txt
“脚本和交互/打印之间的差异”一段
/mongo server.com/mydb--quiet--eval“db.users.find().forEach(printjson);”>1.txt
您可以使用forEach()跳过while循环。
:
对于distinct,您必须创建包含以下内容的script.js文件:
mongo = new Mongo("localhost");
doctor = mongo.getDB("doctor");
users = doctor.getCollection("users");
cities = users.distinct("address.city");
printjson(cities);
然后在控制台中运行:
mongo --quiet script.js > result.txt
每当我需要将mongo查询的结果写入本地文件时,我通常使用
writeFile(pathToFile,stringContents)
函数
例如:假设您需要快速找到所有注册用户的电子邮件,并将其发送给营销部门的好友Jim
$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.json", tojson(emails))
或者如果Jim expect是CSV文件
$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.csv", emails.join("\n"))
你现在可以给Jim发送电子邮件列表并保存一天
有关writeFile
函数的重要注意事项:
谢谢你的回复,但我希望这是在使用MongoShell运行的普通js中。是的,这是可能的。但我正在尝试将脚本作为守护进程运行。所以只有我要求进行文件写入操作。谢谢。如何指定脚本应使用的数据库?@NeluMalancea您只需使用任何Mongo shell命令行参数即可。因此,要指定远程主机上的数据库,例如mongo--host MYSERVER DATABASENAME--quiet script.js>result。txt@NeluMalancea您可以使用
dr=new Mongo(“127.0.0.1:27017”).getDB(“dr”)
然后在您的集合前面加上dr。这将使您能够使用多个数据库;i、 从一份副本读到另一份副本等。此答案不符合原始意图。有没有办法从mongo脚本写入文件?顺便说一句,如果您总是迭代整个集合,那么使用mongodump会更有效。使用脚本更灵活,您可以在打印结果之前进行各种处理。如果由于字符转义而希望将查询放入find()中,则此方法的更多信息将变得棘手。在这种情况下,最好使用上面@milan的答案和一个单独的查询file@AndrewL你能用单引号代替吗?我认为这不应该做太多转义之类的事情,对吗?对于打印某些字段/自定义格式,使用:“.forEach(function(d){print(d.id);}”);”。是的,可以在find过滤器中使用单引号,例如。更简洁的是:db.users.find().forEach(printjson);这听起来不错,但是writeFile
来自哪里?它未在我的mongo CLI中定义。我似乎也找不到关于它的任何文档(但可能我没有认真查找?)。也许我的mongo客户端太老了?它是NodeJS fs API的一部分。请看这里:Mongo通常倾向于添加一些更奇特的函数,而不记录它们writeFile
就是这样一个例子。这是正常的mongo shell函数,只是他们决定不记录它。mongo中有许多未记录的函数,包括多个文件系统I/O函数、允许用户从键盘输入数据的函数、允许从mongo shell执行操作系统命令的函数等等。NodeJS没有在mongoshell中实现,因为NodeJS中的大多数其他函数在mongoshell中不起作用writeFile
还有一些,但很少。mongo shell有两个与NodeJS同名的函数,这只是巧合。
$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.json", tojson(emails))
$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.csv", emails.join("\n"))