有没有办法确定电机mongo光标的长度或向前偷看以查看是否有下一个(而不是fetch_next
或许has_next
)
而不是未考虑提供限制的cursor.size()
()
基本上我想添加所需的json逗号
while (yield cursor.fetch_next):
document = cursor.next_object()
print document
if cursor.has_next() # Sweeet
print ","
答案 0 :(得分:1)
您可以使用“alive”属性。试试这个:
from tornado import gen, ioloop
import motor
client = motor.MotorClient()
@gen.coroutine
def f():
collection = client.test.collection
yield collection.drop()
yield collection.insert([{'_id': i} for i in range(100)])
cursor = collection.find()
while (yield cursor.fetch_next):
print cursor.next_object(), cursor.alive
ioloop.IOLoop.current().run_sync(f)
它打印“True”直到最终文档,当alive为“False”时。
MotorCursor批量从服务器获取数据。 (The MongoDB documentation on batches解释了游标和批处理如何适用于所有MongoDB驱动程序,包括Motor。)当“alive”为True时,表示服务器上有更多可用数据,或者数据在MotorCursor中缓冲,或者两者都有
然而,有一种竞争条件。假设您获取除最终文档之外的所有文档,并且在获取最后一个文档之前,另一个客户端删除它,那么即使“alive”为“True”,您也将无法找到最后一个文档。最好重新安排循环:
@gen.coroutine
def f():
collection = client.test.collection
yield collection.drop()
yield collection.insert([{'_id': i} for i in range(100)])
cursor = collection.find()
if (yield cursor.fetch_next):
sys.stdout.write(str(cursor.next_object()))
while (yield cursor.fetch_next):
sys.stdout.write(", ")
sys.stdout.write(str(cursor.next_object()))
print