web-dev-qa-db-ja.com

pymongoの並べ替えとfind_oneの問題

キーpositionを使用してuser_scoreというコレクションを並べ替え、結果の最初のドキュメントを取得しようとしています。この場合、コレクションuser_scoreは存在せず、結果をNoneとして取得したいと思っていましたが、カーソルが戻ってきました。

1.結果=

db.user_score.find({'score':'$lt':score}}).sort("position,pymongo.DESCENDING").limit(1)

今、私は以下のようにクエリを変更しましたが、期待どおりに何も得られませんでした。

2.結果=

db.user_score.find_one({'score':{'$lt':score}}, sort=[("position", pymongo.DESCENDING)])

私の最初のクエリの問題は何ですか?

ありがとう

12
Krishna

最初のクエリでは、並べ替え関数で1つの引数を渡します("position,pymongo.DESCENDING")、2つの引数を渡す必要がある場合("position", pymongo.DESCENDING)

引用符を忘れないでください。

12
vanev_

応答が少し遅れましたが、現在のバージョンのPyMongoはfind_one呼び出しで sort 操作をサポートしているようです。

ドキュメントページから ここ (find_oneのセクションをgrepしてください):

Find()のすべての引数は、find_one()の有効な引数でもありますが、limit引数は無視されます。単一のドキュメントを返します。一致するドキュメントが見つからない場合はNoneを返します。

使用例は次のとおりです。

filterdict = {'email' : '[email protected]'}
collection.find_one(filterdict, sort=[('lastseen', 1)])

これが最近の検索者に役立つことを願っています!

5
kilokahn

これは、findでのデフォルトのmongodbの動作です。 findを使用するたびに、結果のリスト(この場合は反復可能なカーソル)が表示されます。クエリに一致するものがない場合は、findOne-またはPyMongoと同等のfind_oneのみがNoneを返します。

2
luke14free