如何正确获取 MongoDB 集合里面的最后一条数据
在我们使用 Python 查询 MongoDB 的时候,一般会使用MongoDB 的集合(collection)对象的 find()
方法或者find_one()
方法:
1 | import pymongo |
其中,find()
方法返回的是一个游标对象,我们可以直接对这个对象进行迭代,从而按顺序获取每一条数据。
这个游标对象还有一个sort()
方法,可以对迭代返回的数据进行排序,例如想对数据按照_id
倒序显示,那么可以把代码写为:
1 | rows = handler.find().sort('_id', -1) |
运行效果如下图所示:
需要注意,对游标对象执行了sort()
方法以后,返回的依然是游标对象。所以如果我们只想获取最后一条数据怎么办呢?有如下2种方法:
1 | rows = handler.find().sort('_id', -1).limit(1) # 倒序以后,只返回1条数据 |
或者我们可以使用第二种方式:
1 | rows = handler.find().sort('_id', -1) |
运行效果如下图所示:
这是由于游标对象是一个可迭代对象,所以可以使用next
函数获取它第一次迭代的值。
我们平时使用find_one()
时,返回的都是第一个满足条件的数据,那么有办法返回最后一个满足条件的数据呢?
由于 find_one()
返回的数据是None
或者一个字典。他们都没有sort()
方法,所以不能使用下面这种写法:
1 | row = handler.find_one().sort('_id', -1) |
正确的写法,是把sort
作为参数写在find_one()
方法里面:
1 | row = handler.find_one(sort=[('_id', -1)]) |
运行效果如下图所示:
作为参数的sort
,它的值是一个列表,列表里面的每一个元素都是元组,元组的第一个值为需要被排序的字段名,第二个值为1或者-1,1表示正序,-1表示倒序。如果列表里面有多个元组,那么先按第一个元组对应的字段排序,第一次排序的结果里面,值相同的再按第二个元组对应的字段排序,以此类推。