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.7find().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.