【问题标题】:Pymongo query on a cursor游标上的 Pymongo 查询
【发布时间】:2021-07-17 11:07:27
【问题描述】:

我想要对其进行操作的大型集合(7300 万个条目)。首先,我想查询约 98% 的数据,然后对最后 2% 进行更大的操作。首先我做

query_cursor = collection.find({'score': {'$gt': threshold}}) 

返回查询的游标。将其写入列表并在列表上执行操作比我可以选择使用 fx 重新查询此游标要慢得多

query_cursor.find({'filename': 'abc'})

但是,因为我需要对其进行多次操作,所以不断地做是不可行的

query_cursor = collection.find({'score': {'$gt': threshold}, 'filename': 'abc'}) 

那么有没有办法在光标上查询?

【问题讨论】:

  • “但是,因为我需要对其进行多次操作,...”:在这种情况下,您可以使用聚合查询,它允许对它进行更复杂的操作输入收集数据。但是,您也可以对光标进行一些操作;见Cursor Methods
  • 这也适用于 python 和 Pymongo 吗?我尝试使用 Pymongo 中似乎没有实现的 .forEach 函数
  • 根据pymongo.readthedocs.io/en/stable/api/pymongo/cursor.html,唯一的选择似乎是 .where 搜索,这可能很有用,但不是我真正想要的

标签: python mongodb pymongo


【解决方案1】:

游标不存储文档。它本质上是指向服务器上结果集的指针。驱动程序一次检索一批文档,并在获取下一批之前将每个批次转发给应用程序。

驱动程序或服务器中也没有工具来回退光标(或向前跳过)。文档必须按顺序检索。

因此,唯一支持的游标操作是按顺序读取结果集中的所有文档,一次。

如果您想对数据执行多次传递,您需要将其存储在您的应用程序中或发出多个查询(或让单个查询产生您需要的所有数据)。

您也许可以找到一个库来过滤申请过程中的结果。例如,Mongoid 使用 embedded matching

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 2014-12-20
    • 2019-07-15
    • 1970-01-01
    • 2013-03-07
    • 2021-11-12
    • 2016-02-08
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多