我可以只获取Cursor对象中的第一项(pymongo)吗?

时间:2016-01-07 00:37:27

标签: python mongodb pymongo

所以我通过

创建了一个Cursor对象
cdb=self.mongo['bleh_bleh_bleh_setup_here']
data=cdb[collection].find(query_commands_here)

不要担心上面的语法。假设我可以成功创建这样的游标对象

我知道我可以做一个for循环遍历对象,但我想要的只是这个对象的第一项。有没有比循环更有效的方法?

编辑:

为了使事情更加清晰,'bleh_bleh_bleh_setup_here'只是连接到所需mongoDB的路径,'query_commands_here'是像{field1:{'$gt':num1}, field2:{'$ne':num2}}这样的查询。这条线

data=cdb[collection].find(query_commands_here)

将为我提供一个Cursor对象,我可以使用for循环进行迭代。像

这样的事情
for item in data:
    print item

将打印出对象中的每个条目。它工作得很好。但是,根据文档,此游标对象应该具有名为.hasNext()的方法,如果有下一个条目,则应返回True。到目前为止,我还没有找到一种方法让它因某些奇怪的原因而起作用。 data.next()确实给了我一个条目。我想确保我可以有这个条件,以确保我不会为一个不包含任何内容的游标对象调用.next(),虽然我不预见会发生这种情况,但我会认为它是'发生在某个时刻。

2 个答案:

答案 0 :(得分:14)

.find_one()会返回符合条件的单个文档:

cdb[collection].find_one(query_commands_here)

请注意,PyMongo Cursor没有hasNext()方法。我要做的是致电cursor.next()并处理StopIteration例外:

try:
    record = cursor.next()
except StopIteration:
    print("Empty cursor!")

答案 1 :(得分:2)

您还可以执行以下操作(无需处理 StopIteration 异常)

cur = cdb[collection].find(query_commands_here)
record = next(cur, None)
if record:
    # Do your thing

这是可行的,因为 python 内置的 next() 会在到达迭代器末尾时返回默认值。