你需要在 pymongo 中延迟 .count() 并扭曲吗?

Do you need to defer .count() in pymongo and twisted?

我 运行 被 pymongo 迷住了。我知道在使用 pymongo .find() 查询时,你需要在遍历游标时推迟它。

.count() 是否同样适用?我需要推迟还是不停?

编辑:如果必须推迟,正确的做法是什么?

是否需要先创建一个游标,然后在其上调用计数:

value_deferred = deferToThread(
                mongo_collection.find,
                mongo_query,
            )
value_deferred.count()

或者有什么方法可以立即得到计数?

如果我这样做:

def get_filtered_count():
    return db_collection.find(mongo_query).count()

value_to_get = deferToThread(get_filtered_count())

我收到此错误:exceptions.TypeError:'int' 对象不可调用

编辑 2:这里使用 yield 是否合理?否则调用它时会出错。

@inlineCallbacks
def render_deferred(self, request):
  cursor = self.mongo.find()
  get_counter = yield deferToThread(cursor.count)
  page_size = 3
  number_of_pages = get_counter / page_size
  return final_value

def render_GET(self, request):
  ## some code
  deferred = self.render_deferred(request)

  deferred.addCallback(_send, request)
  deferred.addErrback(handle_failure, request)

您必须推迟的是对 count 的实际调用。 find 方法只创建一个游标而不执行 I/O,而调用 count 会执行。所以你可以在主线程或工作线程上调用find,这取决于什么方便。

调用deferToThread时,传递函数,不要调用它:

value_to_get = deferToThread(get_filtered_count)

或者只是:

cursor = collection.find(query)
deferred = deferToThread(cursor.count)