我正在尝试从mongo集合中检索一个元素,即具有最大_id字段的元素。我知道这可以通过查询来完成:
db.collection.find().sort({_id: -1}).limit(1)
但它似乎有点不合适,我想知道是否有办法使用findOne()来获取特定元素
注意:我想这样做是因为,根据我在ObjectId中读到的内容,第一个字节对应于自Epoch以来的毫秒数,因此,插入的最后一个元素将具有最大的_id。有没有其他方法可以检索插入集合中的最后一个元素?
答案 0 :(得分:80)
你应该像你现在一样使用find
而不是聚合,因为它需要扫描所有 _id字段的值来计算最大值。
正如评论所指出的,使用find()和findOne()之间存在 no 的区别 - 功能上或优雅方面。实际上,shell(以及实现它的驱动程序)中的findOne
是根据find定义的(限制为-1,在shell中使用漂亮的打印)。
如果确实想要做相同的
db.collection.find().sort({_id:-1}).limit(1).pretty()
作为findOne
您可以使用以下语法执行此操作:
db.collection.findOne({$query:{},$orderby:{_id:-1}})
答案 1 :(得分:9)
您可以使用mongodb的聚合获取max _id。查找和排序可能有点过头了。
db.myCollection.aggregate({
$group: {
_id: '',
last: {
$max: "$_id"
}
}
});
答案 2 :(得分:1)
with PHP driver (mongodb)
using findOne()
$filter=[];
$options = ['sort' => ['_id' => -1]]; // -1 is for DESC
$result = $collection->findOne(filter, $options);
$maxAge = $result['age']
答案 3 :(得分:0)
import pymongo
tonystark = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = tonystark["tonystark_db"]
savings = mydb["customers"]
x = savings.find().sort("_id")
for s in x:
print(s)
答案 4 :(得分:-1)
var targetStrJson = [['foo', 25], ['xyz', 49]]