124

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

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

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

其中 idate 添加了时间戳。

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

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

4

9 回答 9

168

这是对先前答案的重新哈希,但它更有可能在不同的 mongodb 版本上工作。

db.collection.find().limit(1).sort({$natural:-1})
于 2014-08-31T00:53:22.400 回答
47

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

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

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

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

于 2014-02-02T21:28:31.143 回答
19

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

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

也就是说,_id如果您使用ObjectId的是您的 ID,您也可以按 排序。详情请看这里。当然,即使这样也只好到最后一秒。

你可以诉诸“写两次”。一次写入主集合,然后再次写入“最后更新”集合。如果没有事务,这不会是完美的,但是“最后更新”集合中只有一个项目,它总是很快的。

于 2012-06-06T20:24:09.327 回答
17

从 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, 根据它们的 s定义所有文档的降序投影。

排序投影(_id:reverse order):从集合中获取最新(最后)文档。

> 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." }
于 2018-11-26T03:35:32.417 回答
2

我的解决方案:

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

于 2018-01-07T07:45:19.027 回答
2

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

于 2016-10-13T04:01:24.020 回答
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/

于 2020-05-07T14:46:11.843 回答
0

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

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

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

于 2018-03-28T08:59:50.387 回答
0

Mongo CLI 语法:

db.collectionName.find({}).sort({$natural:-1}).limit(1)
于 2021-12-12T03:24:35.083 回答