2012-04-09 405 views
8

我想要使用密钥position对名为user_score的集合进行排序,并获取结果的第一个文档。在这种情况下,收集user_score不存在,我希望得到的结果为None,但我得到一个游标回来。pymongo排序和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

在您的第一个查询中,在排序函数中,您传递一个参数("position,pymongo.DESCENDING"),当您应该传递两个参数("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 2017-05-12 13:33:04

0

一点在我的回应迟,但似乎PyMongo的当前版本并在find_one呼叫支持sort操作。

从文档页面here(请用grep为find_one部分):

所有参数找到()也是find_one有效参数(), 尽管任何限制参数将被忽略。返回单个 文档,如果找不到匹配的文档,则返回None。

用法示例如下:

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

希望这有助于更近的搜索!