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

Jor*_*rge 54 mongodb

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

db.collection.find().sort({_id: -1}).limit(1)
Run Code Online (Sandbox Code Playgroud)

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

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

Asy*_*sky 85

您应该使用find,就像您现在一样,而不是聚合速度较慢,因为它需要扫描_id字段的所有值以确定最大值.

正如评论所指出的,使用find()和findOne()之间没有区别 - 功能上或优雅.事实上,findOne在shell(以及实现它的驱动程序中)是根据find定义的(限制为-1,在shell中使用漂亮的打印).

如果你真的想做相同的

db.collection.find().sort({_id:-1}).limit(1).pretty()
Run Code Online (Sandbox Code Playgroud)

正如findOne您可以使用以下语法执行此操作:

db.collection.findOne({$query:{},$orderby:{_id:-1}})
Run Code Online (Sandbox Code Playgroud)


Sum*_*eet 9

你可以使用mongodb的聚合获得max _id.查找和排序可能有点过头了.

db.myCollection.aggregate({
    $group: {
        _id: '',
        last: {
            $max: "$_id"
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这比find()更优雅?它永远不会更快,在大多数情况下可能会慢得多. (5认同)
  • [引证需要] (3认同)
  • 实际上,它不是查找和排序 - 使用sort查找使用索引来立即选择单个值.您的聚合答案必须扫描整个值范围). (2认同)