17

我正在尝试user_score使用 key对调用的集合进行排序position并获取结果的第一个文档。在这种情况下,集合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)])

我的第一个查询有什么问题?

谢谢

4

4 回答 4

20

我的回复有点晚了,但看起来 PyMongo 的当前版本确实支持对 find_one 调用进行排序操作。

此处的文档页面(请查找 find_one 部分):

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

示例用法如下:

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

希望这可以帮助更多最近的搜索者!

于 2018-02-04T11:19:59.757 回答
15

在您的第一个查询中,在您传递一个参数的排序函数中("position,pymongo.DESCENDING"),当您应该传递两个参数时("position", pymongo.DESCENDING)

请务必注意引号。

于 2012-12-27T15:59:25.447 回答
2

这是 find 的默认 mongodb 行为。每当你使用find时,你都会得到一个结果列表(在这种情况下是一个可迭代的游标)。只有- 或者如果查询没有匹配findOne项,它的 PyMongo 等效项find_one将返回。None

于 2012-04-09T20:31:50.063 回答
-3

使用 list 将光标的值转换为 dict:

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

于 2016-09-30T00:20:45.197 回答