2012-04-09 9 views
8

positionというキーを使用してuser_scoreというコレクションをソートしようとしており、その結果の最初の文書を取得しています。この場合、コレクションuser_scoreは存在しません。私はNoneという結果を得ることを望んでいましたが、カーソルを戻していました。pymongo sortとfind_oneの問題

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

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

ありがとうございました

答えて

2

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

9

最初のクエリでは、2つの引数("position", pymongo.DESCENDING)を渡す必要があるときに、ソート関数で1つの引数("position,pymongo.DESCENDING")を渡しています。

引用符に注意してください。

-1

辞書にカーソルの値を変換するために使用リスト:

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

+0

これも私が解決した方法でした。 find_oneは.sortを取っていませんが、find()はソートするので、最初のリスト項目を制限して取得することができました – pojda

0

少し遅れて、私の応答が、PyMongoの現在のバージョンはfind_one呼び出しでsort操作をサポートすることが表示されます。ドキュメントページhere(find_oneのセクションをgrepしてください)から

:任意の制限引数は無視されますが、

見つけるために、すべての引数は()もfind_oneの有効な引数()、 です。単一の ドキュメントを返します。一致するドキュメントが見つからない場合は、Noneを返します。次のように

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

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

が、これは、より最近のサーチャーを役に立てば幸い!