web-dev-qa-db-ja.com

Cursorオブジェクト(pymongo)の最初のアイテムを取得できますか?

だから私はカーソルオブジェクトを作成しました

_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)
_

forループで反復できるCursorオブジェクトを取得します。のようなもの

_for item in data:
    print item
_

オブジェクトの各エントリを出力します。それはうまくいきます。ただし、ドキュメントによると、このカーソルオブジェクトには.hasNext()というメソッドが必要です。次のエントリがある場合、Trueを返します。これまでのところ、奇妙な理由で動作させる方法を見つけていません。 data.next()でもエントリが表示されます。このような状況が発生することはないと思いますが、何も含まれていないカーソルオブジェクトに対して.next()を呼び出さないようにするために、その条件を備えていることを確認したいのですが、ある時点で発生します。

15
JChao

.find_one() は、条件に一致する単一のドキュメントを返します。

_cdb[collection].find_one(query_commands_here)
_

PyMongo Cursor にはhasNext()メソッドがないことに注意してください。私がすることはcursor.next()を呼び出してStopIteration例外を処理することです:

_try:
    record = cursor.next()
except StopIteration:
    print("Empty cursor!")
_
15
alecxe