【问题标题】:Pymongo: iterate over all documents in the collectionPymongo:遍历集合中的所有文档
【发布时间】:2017-04-15 09:49:32
【问题描述】:

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

我无法找出正确的语法来使用find().forEach()

我正在尝试类似的解决方法

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

REGEX 将匹配所有内容 - 结果是“Killed”。 我也试过了

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

但这也没用。

有什么建议吗?

【问题讨论】:

  • 您的实际查询或您想要的结果是什么?请解释清楚一点。
  • 我不确定您是否尝试过,请尝试使用 map reduce 作业来完成您的工作。考虑到庞大的数据集,它似乎是一个更好的选择。这只是一个建议。

标签: mongodb pymongo database-cursor


【解决方案1】:

我无法找出使用 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 运算符是不正确的。您在$exists 中缺少s。同样,不幸的是,我们不知道关于“不起作用”意味着什么来帮助进一步调试的太多信息。

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

您还可以通过MongoDB University 注册免费在线课程M101P: MongoDB for Python Developers

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

请参阅mongoexport usage 了解更多信息。

【讨论】:

    【解决方案2】:

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

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

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

    然后遍历匹配项

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

    【讨论】:

      【解决方案3】:

      find() 方法返回一个PyMongo 游标,它是对查询结果集的引用。

      您必须以某种方式取消引用引用(地址)。

      之后,您将更好地了解如何操作/管理光标。

      尝试以下方法开始:

      result = db.*collection_name*.find()
      print(list(result)) 
      

      【讨论】:

        【解决方案4】:

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

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

        第二行使用 python list() 函数将结果作为列表返回。

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

        我相信通过列表应该更容易弄清楚如何输出到.csv

        【讨论】:

          猜你喜欢
          • 2018-02-19
          • 1970-01-01
          • 2012-04-05
          • 2016-05-21
          • 2016-10-22
          • 2018-01-09
          • 2021-08-26
          • 2018-07-07
          • 2020-11-08
          相关资源
          最近更新 更多