简体   繁体   中英

pymongo sort and find_one issue

I am trying to sort a collection called user_score using the key position and get the very first document of the result. In this case the collection user_score doesn't exist and I was hoping to get the result as None , but i was getting a cursor back.

1. result =

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

Now i changed my query like below and did not get anything as expected.

2. result =

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

What's the problem with my first query?

Thanks

A little late in my response but it appears that the current version of PyMongo does support a sort operation on a find_one call.

From the documentation page here (please grep the section for find_one):

All arguments to find() are also valid arguments for find_one(), although any limit argument will be ignored. Returns a single document, or None if no matching document is found.

Example usage is as follows:

filterdict = {'email' : 'this.is@me.com'}
collection.find_one(filterdict, sort=[('lastseen', 1)])

Hope this helps more recent searchers!

In your first query, in the sort function you're passing one argument ("position,pymongo.DESCENDING") , when you should be passing two arguments ("position", pymongo.DESCENDING) .

Be sure to mind your quotation marks.

This is the default mongodb behavior on find. Whenever you use find you get a list of the result (in this case an iterable cursor). Only findOne - or it's PyMongo equivalent find_one will return None if the query has no matches.

Use list to convert the value of the cursor into a dict:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM