【问题标题】:Can I just get the first item in a Cursor object (pymongo)?我可以只获取 Cursor 对象(pymongo)中的第一项吗?
【发布时间】:2016-04-11 06:31:30
【问题描述】:

所以我通过

创建了一个 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(),尽管我没有预见到这种情况会发生,但我认为它会发生在一点。

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

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

    cdb[collection].find_one(query_commands_here)
    

    请注意,PyMongo Cursor 没有 hasNext() 方法。我要做的是调用cursor.next() 并处理StopIteration 异常:

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

    【讨论】:

    • 谢谢!现在我想保留 Cursor 对象中的所有信息,同时从第一个条目中检索一些信息(因为我在.find 中有一个排序命令)。使用cdb[collection].find() 和另一行使用cdb[collection].find_one(query_command_here, sort[('field_to_sort': -1)] 是否足够有效?
    • 或者更确切地说,我想要的只是find_one 结果的一个字段。我怎样才能做到这一点?
    • @JChao 我想你可能只需要一个find() 命令就可以了。您可以调用cursor.next() 获取第一条记录,然后调用cursor.rewind() 重置它的状态。不过,我个人还没有尝试过——请仔细测试并记录发送到服务器的查询。谢谢。
    • @JChao 很有趣,cursor.next() 应该可以工作..你能提供你拥有的完整代码和回溯吗?谢谢。
    • 谢谢。我通过使用 c[i] 找到了一种解决方法,其中 i 是索引 #。这调用了 getitem 函数,该函数非常适合我的情况。
    【解决方案2】:

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

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

    这是可行的,因为 python 内置的 next() 将在迭代器结束时返回默认值。

    【讨论】:

      猜你喜欢
      • 2013-03-07
      • 1970-01-01
      • 2015-01-14
      • 2011-05-07
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多