获取mongodb系列的最新记录

时间:2012-06-06 19:14:48

标签: mongodb mongodb-query

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

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

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

其中idate已添加时间戳。

问题是收集是时候收回数据和我的测试'收藏真的很大。我需要一个具有恒定时间响应的查询。

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

8 个答案:

答案 0 :(得分:108)

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

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

答案 1 :(得分:25)

这将为您提供collection

的最后一个文档
db.collectionName.findOne({}, {sort:{$natural:-1}})

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

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

答案 2 :(得分:19)

  

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

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

如上所述,如果您使用_id ID,也可以按ObjectId排序。 See here for details。当然,即便如此,直到最后一秒也是如此。

您可以诉诸"写两次"。一次写入主集合并再次写入"最后更新"采集。没有交易,这将不是完美的,但只有一个项目在"最后更新"收集它总是很快。

答案 3 :(得分:7)

还有另一种从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}),基于所有文档的_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." }

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我的解决方案:

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

答案 7 :(得分:0)

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

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

上面的查询会为插入到集合

中的最新文档提供 _id