从mongodb集合获取最新记录


99

我想知道集合中的最新记录。怎么做?

注意:我知道以下命令行查询有效:

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

其中idate已添加时间戳。

问题是收集需要更长的时间才能取回数据,而我的“测试”收集确实非常庞大。我需要一个具有恒定时间响应的查询。

如果有更好的mongodb命令行查询,请告诉我。

Answers:


138

这是对先前答案的重述,但更可能适用于不同的mongodb版本。

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

10
db.collection.find().limit(1).sort({$natural:-1}).pretty()如果您希望它看起来不错
安东尼

所以,这个命令有什么区别:db.collection.find().sort({$natural:-1}).limit(1).pretty()
Leo

如果您将输出限制为一个文档,并且它必须是集合中最重要的文档,则@Digits如果将限制放在末尾会对性能产生什么影响,以及如何获取最后一条记录。
kailash yogeshwar '16

好答案。我是这样尝试的:db.collection(“集合名称”).find({},{limit:1})。sort({$ natural:-1})
Abdul Alim Shakir

对于使用AWS DocDB的任何人:Query failed with error code 303 and error message 'option $natural is not supported' on server docdb。希望该功能即将推出。
Marc

34

这将为您提供最后一份文件 collection

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

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

编辑:对于所有的拒绝投票者,上面是Mongoose语法,mongo CLI语法是:db.collectionName.find({}).sort({$natural:-1}).limit(1)


7
您的语法似乎是错误的。我无法像您所拥有的那样使它正常工作。起作用的是:'db.punchdeck.findOne({$ query:{},$ orderby:{$ natural:-1}})'
Dave Lowerre 2014年

不知道为什么所有的反对票-该代码对我来说非常有效,而且速度很快
dark_ruby 2014年

2
@dark_ruby您查询返回错误“ $ err”:“无法规范化查询:BadValue不支持的投影选项:排序:{$ natural:-1.0}”,
Roman Podlinov

20

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

默认情况下,MongoDB中的索引是B树。搜索B树是O(logN)操作,因此甚至find({_id:...})不会提供恒定的时间O(1)响应。

也就是说,_id如果您使用的ObjectId是ID ,也可以按进行排序。有关详细信息,请参见此处。当然,即使这样也只能持续到最后一秒。

您可以求助于“两次书写”。一次写入主集合,然后再次写入“最新更新”集合。如果没有交易,这将不是完美的,但是只有“上次更新”集合中的一项,它将总是很快。


2
我看到许多noSQL和MongoDB解决方案都提倡“两次写入”,主要是针对计数持有者,当数据量变得很大时。我猜这是常见的做法吗?
Vinny 2012年

MongoDB不会非常频繁地刷新到磁盘,并且没有事务,因此写入变得明显更快。这里的权衡是,鼓励您取消规范化数据,这通常会导致多次写入。当然,如果您获得10倍或100倍的写吞吐量(我见过),那么2倍或3倍的写吞吐量仍然是一个很大的改进。
盖茨副总裁

13

从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" }

sort({'_id':-1}),根据所有文档的_ids 降序定义投影。

排序投影(_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." }

2

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



0

如果您在文档中使用自动生成的Mongo对象ID,它将在其中包含时间戳记作为前4个字节,使用该时间戳记可以找到插入集合中的最新文档。我知道这是一个古老的问题,但是如果有人仍然在这里寻找另外一个选择。

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

上面的查询将为_id提供插入到集合中的最新文档


0

这是如何从“ 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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.