Pymongo:迭代集合中的所有文档

时间:2016-11-30 22:05:12

标签: mongodb cursor pymongo

我正在使用PyMongo并尝试迭代我的MongoDB集合中的(1000万)文档,只提取几个键:" name"和"地址",然后将它们输出到.csv文件。

我无法用find()。forEach()

找出正确的语法

我正在尝试像

这样的解决方法
   cursor = db.myCollection.find({"name": {$regex: REGEX}})

其中REGEX会匹配所有内容 - 并导致" Killed"。 我也试过

   cursor = db.myCollection.find({"name": {"$exist": True}})

但这也不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

  

我无法用find()。forEach()

找出正确的语法

cursor.forEach()不适用于Python,它是一个JavaScript函数。你必须获得一个游标并迭代它。请参阅PyMongo Tutorial: querying for more than one document,您可以在哪里执行:

for document in myCollection.find():
    print(document) # iterate the cursor
  

其中REGEX会匹配所有内容 - 并导致" Killed"。

不幸的是,这里缺乏信息来调试为什么以及什么' Killed'是。虽然如果你想匹配所有内容,你可以说:

cursor = db.myCollection.find({"name": {$regex: /.*/}}) 

鉴于字段name包含字符串值。虽然使用$exists来检查字段name是否存在比使用正则表达式更好。

虽然在上面的示例中使用$exists运算符不正确。您在s中遗漏了$exists。不幸的是,遗憾的是,我们并不了解有关“无法运作”的信息。意在帮助进一步调试。

如果您正在为Python练习编写此脚本,我建议您查看:

您还可以MongoDB UniversityM101P: MongoDB for Python Developers注册免费在线课程。

但是,如果您只是想完成从集合中导出CSV的任务。作为替代方案,您可以使用MongoDB' mongoexport。哪个支持:

有关详细信息,请参阅mongoexport usage

答案 1 :(得分:0)

我也没有对.find()。forEach()感到幸运,但这应该可以找到您要搜索的内容,然后打印出来。

首先查找与您要搜索的内容匹配的所有文档

cursors = db.myCollection.find({"name": {$regex: REGEX}})

然后遍历比赛

for cursor in cursors
    print(cursor.get("name"))

答案 2 :(得分:0)

我想我知道了问题,但是我相信还没有准确的答案。我遇到了同样的挑战,这就是我的解决方法,尽管我不知道如何输出到.csv文件。对于我的情况,我需要JSON中的结果。这是我使用mongodb Projections解决您的问题的方法;

your_collection = db.myCollection
cursor = list(your_collection.find( { }, {"name": 1, "address": 1}))

第二行使用python list()函数以列表形式返回结果。

然后您可以使用jsonify(cursor)或仅将print(cursor)用作列表。

我相信使用该列表应该更容易确定如何输出到.csv