使用pymongo获取具有排序和限制的请求结果

时间:2019-04-04 13:56:44

标签: python mongodb-query pymongo

让我们将这个简单的集合market_types_codes包含2个文档:

col

要访问上一个时间戳(第二个文档中的一个),我首先执行了此请求

{
    "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd2"),
    "timestamp" : 1551736800,
    "score" : 10
}
{
    "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd3"),
    "timestamp" : 1551737400,
    "score" : 12
}

然后是a = db['col'].find({}).sort("_id", -1)

但是由于此集合中将有很多文档,所以我认为仅请求带有limit函数的最后一个文档会更有效,例如

a[0]['timestamp']

然后

a = db['col'].find({}).sort("_id", -1).limit(1)

因为只有一个,所以我可以在循环内声明变量。

那么三个问题:

  • 如果我继续使用第一个请求并获得dic中的第一个元素,我是否需要担心内存/速度问题?
  • 使用限制请求时,是否有更聪明的方法来访问游标的第一个元素而不是使用循环?
  • 还有另一种获取我不知道的时间戳的方法吗?

谢谢! Python 3.6 / Pymongo 3.7

2 个答案:

答案 0 :(得分:1)

如果在选择条件中使用具有唯一索引的任何字段,则应使用rank方法,该方法将返回唯一与查询匹配的文档。

话虽这么说,find_one方法将返回一个Cursor对象,并且不会将数据加载到内存中。

如果使用过滤器选项,则可能会获得更好的性能。现在,您的查询将进行集合扫描。

如果您不使用过滤器,并且想检索最后一个文档,那么干净的方法是使用Python内置的find函数。您也可以使用next方法。

next

答案 1 :(得分:0)

find()。sort()是如此之快,不必担心速度,它是访问光标第一个元素的最佳途径。