【问题标题】:File write operations in mongo script?mongo脚本中的文件写入操作?
【发布时间】:2012-02-16 18:34:38
【问题描述】:

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

例如:-

cursor = db.users.find();

while(cursor.hasNext()) {
  cursor.next();
  // writing the cursor output to file ????<br/>
}

【问题讨论】:

  • 顺便说一句,如果您总是迭代整个集合,那么使用 mongodump 会更有效。使用脚本更加灵活,可以在打印结果之前进行各种处理。
  • 更多关于mongodump

标签: mongodb


【解决方案1】:

你可以使用 print 然后重定向输出:

script.js:

cursor = db.users.find();
while(cursor.hasNext()){
    printjson(cursor.next());
}

然后运行脚本并将输出重定向到文件:

mongo --quiet script.js > result.txt

【讨论】:

  • 是的,这是可能的。但我正在尝试将脚本作为守护进程运行。所以只有我要求进行文件写入操作。谢谢。
  • 如何指定脚本应该使用的数据库?
  • @NeluMalancea 您可以简单地使用任何 Mongo shell 命令行参数。因此,要在远程主机上指定数据库,例如mongo --host MYSERVER DATABASENAME --quiet script.js > result.txt
  • @NeluMalancea 您可以使用dr= new Mongo("127.0.0.1:27017").getDB("dr"),然后在您的收藏前面加上博士。这将使您能够使用多个数据库;即从一个副本读取到另一个副本等。
  • 这个答案不符合初衷。有没有办法从 mongo 脚本写入文件?
【解决方案2】:

http://www.mongodb.org/display/DOCS/Scripting+the+shell 段落“脚本化和交互式/打印之间的差异”。

./mongo server.com/mydb --quiet --eval "db.users.find().forEach(printjson);" > 1.txt

【讨论】:

  • 如果您想在 find() 中放置查询,因为字符转义,这种方法会变得很棘手。在这种情况下,最好将上面的@milan 答案与单独的查询文件一起使用
  • @AndrewL 你能用单引号代替吗?我认为这不应该做太多的逃避或其他事情,对吧?
  • 要打印某些字段/自定义格式,请使用:".forEach( function(d) { print( d.id ); } );"。
  • 是的,您可以使用单引号,例如在查找过滤器中。
【解决方案3】:

每当我需要将 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 期望的是 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 函数的重要注意事项:

  1. 第二个参数必须是字符串。
  2. 第一个参数必须是一个不存在的文件,否则会报错。

【讨论】:

  • 这听起来不错,但writeFile 来自哪里?它没有在我的 mongo CLI 中定义。我似乎也找不到任何关于它的文档(但也许我看起来不够努力?)。也许我的 mongo 客户端太老了?
  • 它是 NodeJS fs API 的一部分。见这里:nodejs.org/api/…
  • Mongo 通常倾向于添加一些更奇特的函数而不记录它们。 writeFile 就是这样一个例子。这是正常的 mongo shell 功能,只是他们决定不记录它。 mongo 中有很多未记录的函数,包括更多的文件系统 I/O 函数、允许用户从键盘输入数据的函数、允许从 mongo shell 执行 OS 命令的函数等等。 NodeJS 没有在 mongo shell 中实现,因为 NodeJS 的大多数其他功能在 mongo shell 中不起作用。 writeFile 和其他一些人,但很少。
  • mongo shell 有几个与 NodeJS 同名的函数只是巧合。
【解决方案4】:

你可以使用forEach()跳过while循环:

db.users.find().forEach(printjson);

【讨论】:

  • 更简洁:db.users.find().forEach(printjson);
【解决方案5】:

Mongo drivers 之一用于通用语言(例如 Python、Ruby、Java 等)并将结果以您可以使用的格式写入文件不是更简单(比如CSV等)?

更新:根据mongodump 的文档,您可以使用查询导出集合:

$ ./mongodump --db blog --collection posts
-q '{"created_at" : { "$gte" : {"$date" : 1293868800000},
                      "$lt"  : {"$date" : 1296460800000}
                    }
    }'

但是,您需要将该集合重新导入 MongoDB 以对其进行操作,或者使用 mongoexport 使用与 mongodump 相同的查询标志 (-q) 导出为 JSON 或 CSV。

【讨论】:

  • 感谢您的回复,但我希望这是使用 mongo shell 运行的纯 js。
【解决方案6】:

为了不同,您必须创建包含内容的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多