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

Python 使用pymongo获取具有排序和限制的请求结果,python,mongodb-query,pymongo,Python,Mongodb Query,Pymongo,让我们以这个简单的集合col为例,其中包含两个文档: { "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd2"), "timestamp" : 1551736800, "score" : 10 } { "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd3"), "timestamp" : 1551737400, "score" : 12 } 为了访问最后一个时间戳(第二个文档的时间

让我们以这个简单的集合
col
为例,其中包含两个文档:

{
    "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd2"),
    "timestamp" : 1551736800,
    "score" : 10
}
{
    "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd3"),
    "timestamp" : 1551737400,
    "score" : 12
}
为了访问最后一个时间戳(第二个文档的时间戳),我首先执行了这个请求

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

但是由于这个集合中会有很多文档,我认为只请求最后一个带有limit函数的文档会更有效,比如

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

for doc in a:
    lastTimestamp = doc['timestamp']
因为只有一个,所以我可以在循环中声明变量

所以有三个问题:

  • 如果我继续使用第一个请求并获取dic中的第一个元素,是否需要担心内存/速度问题
  • 在使用limit请求时,有没有更智能的方法来访问游标的第一个元素而不是使用循环
  • 还有别的方法可以得到我不知道的时间戳吗
谢谢!
Python 3.6/Pymongo 3.7

find().sort()速度非常快,不必担心速度,它是访问光标第一个元素的最佳方法。

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

也就是说,
find
方法返回一个游标对象,并且不将数据加载到内存中

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

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


谢谢,我不知道过滤器,我会检查的!这里的
有什么意义?我们不能直接执行
doc=next(cur,None)
with
用于关闭光标@TmSmth吗
cur = db["col"].find().sort({"_id": -1}).limit(1):
with cur:
    doc = next(cur, None) # None when we have empty collection.