python motor mongo cursor length或peek next

时间:2014-06-06 01:34:06

标签: pymongo tornado-motor

有没有办法确定电机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 ","

1 个答案:

答案 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