代码之家  ›  专栏  ›  技术社区  ›  JChao

我可以在Cursor对象(pymongo)中获取第一个项目吗?

  •  23
  • JChao  · 技术社区  · 8 年前

    所以我创建了一个Cursor对象

    cdb=self.mongo['bleh_bleh_bleh_setup_here']
    data=cdb[collection].find(query_commands_here)
    

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

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

    编辑:

    更清楚地说,“bleh_bleh_ableh_setup_here”只是连接到所需mongoDB的路径,而“query_commands_here”是如下查询 {field1:{'$gt':num1}, field2:{'$ne':num2}} 这类事情。线路

    data=cdb[collection].find(query_commands_here)
    

    将给我一个Cursor对象,我可以用 对于 环所以像这样的事情

    for item in data:
        print item
    

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

    2 回复  |  直到 8 年前
        1
  •  29
  •   alecxe    8 年前

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

    cdb[collection].find_one(query_commands_here)
    

    请注意 PyMongo Cursor 没有 hasNext() 方法我要做的就是打电话 cursor.next() 并处理 StopIteration 异常:

    try:
        record = cursor.next()
    except StopIteration:
        print("Empty cursor!")
    
        2
  •  2
  •   rouble    3 年前

    您还可以执行以下操作 (无需处理 StopIteration 例外) :

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

    这是因为python内置于next()中,当它到达迭代器的末尾时将返回默认值。