从 mongodb 收藏中获取最新的记录

我想知道一个集合中最新的记录。如何做到这一点?

注意: 我知道以下命令行查询可以工作:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)

其中 idate 添加了时间戳。

问题是收集的时间越长,就需要越长的时间才能得到数据,而我的“测试”收集的数据实在是太多了。我需要一个具有恒定时间响应的查询。

如果有任何更好的 mongodb 命令行查询,请让我知道。

198077 次浏览

我需要一个具有恒定时间响应的查询

默认情况下,MongoDB 中的索引是 B 树。搜索一个 B-Tree 是一个 O (logN)操作,所以即使 find({_id:...})也不会提供常量时间,O (1)响应。

也就是说,如果您使用 ObjectId作为 ID,也可以按 _id进行排序。详情请参阅此处.当然,即便如此,也只能好到最后一秒。

你可以求助于“写两遍”。向主集合写入一次,然后再次写入“ last update”集合。如果没有事务,这将不是完美的,但只有一个项目中的“最后更新”集合,它将始终是快速的。

这将为 collection提供最后一个文档

db.collectionName.findOne({}, {sort:{$natural:-1}})

$natural:-1表示与插入记录的顺序相反的顺序。

编辑 : 对于所有的反对者来说,上面是一个猫鼬语法, Mongo CLI 语法是: db.collectionName.find({}).sort({$natural:-1}).limit(1)

这是对前一个答案的重复,但它更有可能用于不同的 mongodb 版本。

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

Php7.1 mongoDB:
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);

我的解决方案:

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})

如果您在文档中使用自动生成的 Mongo Object ID,那么它包含时间戳作为前4个字节,使用这些字节可以找到插入到集合中的最新文档。我知道这是个老问题,但如果有人还在这里寻找另一个选择。

db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])

以上查询将为插入到集合中的最新文档提供 身份证

从 MongoDB 集合中获取最后一项的另一种方法(不要介意例子) :

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

法向投影

> db.Sports.find()
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2017", "Body" : "Again, the Pats won the Super Bowl." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

排序投影(_ id: 反序)

> db.Sports.find().sort({'_id':-1})
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2018", "Body" : "Again, the Pats won the Super Bowl" }

根据所有文档的 _id,定义了一个按降序排列的投影。

排序投影(_ id: 反向顺序) : 从集合中获取最新(最后)文档。

> db.Sports.find().sort({'_id':-1}).limit(1)
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

这是如何从“ foo”集合中的所有 MongoDB 文档中获取 最后记录的方法(更改 foo、 x、 y 等)

db.foo.aggregate([{$sort:{ x : 1, date : 1 } },{$group: { _id: "$x" ,y: {$last:"$y"},yz: {$last:"$yz"},date: { $last : "$date" }}} ],{   allowDiskUse:true  })

可以从组中添加或删除

帮助文章: https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

Https://docs.mongodb.com/manual/reference/operator/aggregation/last/

Mongo CLI 语法:

db.collectionName.find({}).sort({$natural:-1}).limit(1)

让 Mongo 创建 ID,它是一个自动递增的散列

我的芒果: Self _ Collection. find () . sort (“ _ id”,-1) . limit (1)