Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb mongo脚本中的文件写入操作?_Mongodb - Fatal编程技术网

Mongodb mongo脚本中的文件写入操作?

Mongodb mongo脚本中的文件写入操作?,mongodb,Mongodb,是否可以从mongo js脚本将查询结果写入文件。我找了很多,但没有找到任何解决办法 例:- cursor=db.users.find(); while(cursor.hasNext()){ cursor.next(); //将光标输出写入文件??? } 对于通用语言(如Python、Ruby、Java等)使用其中一种,并以您可以使用的格式(如CSV等)将结果写入文件,不是更简单吗 更新:根据文档,您可以通过查询导出集合: $ ./mongodump --db blog --collection

是否可以从mongo js脚本将查询结果写入文件。我找了很多,但没有找到任何解决办法

例:-

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"))