我正在与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:这里使用收益是否合理?否则我会在收到错误时收到错误。
@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)
答案 0 :(得分:1)
您必须推迟的是对count
的实际调用。 find
方法只创建一个游标而不执行I / O,而调用count
则执行。因此,您可以在主线程或工作线程上调用find
,具体取决于方便的内容。
当你调用deferToThread时,传递函数,不要调用它:
value_to_get = deferToThread(get_filtered_count)
或者只是:
cursor = collection.find(query)
deferred = deferToThread(cursor.count)