在mongodb中使用findOne来获取具有最大id的元素

时间:2014-03-01 18:07:35

标签: mongodb

我正在尝试从mongo集合中检索一个元素,即具有最大_id字段的元素。我知道这可以通过查询来完成:

db.collection.find().sort({_id: -1}).limit(1)

但它似乎有点不合适,我想知道是否有办法使用findOne()来获取特定元素

注意:我想这样做是因为,根据我在ObjectId中读到的内容,第一个字节对应于自Epoch以来的毫秒数,因此,插入的最后一个元素将具有最大的_id。有没有其他方法可以检索插入集合中的最后一个元素?

5 个答案:

答案 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]]