从 mongodb 集合中获取最新记录

Posted

技术标签:

【中文标题】从 mongodb 集合中获取最新记录【英文标题】:Get the latest record from mongodb collection 【发布时间】:2012-06-10 20:22:08 【问题描述】:

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

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

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

idate 添加了时间戳

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

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

【问题讨论】:

【参考方案1】:

这是对先前答案的重新整理,但它更有可能适用于不同的 mongodb 版本。

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

【讨论】:

db.collection.find().limit(1).sort($natural:-1).pretty() 如果你想让它看起来不错 那么,这个订单有什么不同:db.collection.find().sort($natural:-1).limit(1).pretty() @Digits 如果我们将限制放在最后以及当您将输出限制为一个文档并且它必须是集合中的顶部文档时如何获取最后一条记录,它将对性能产生什么影响。 不错的答案。我试过这样: db.collection("name of collection").find(, limit: 1).sort($natural: -1) 对于使用 AWS DocDB 的任何人:Query failed with error code 303 and error message 'option $natural is not supported' on server docdb。希望该功能尽快推出。【参考方案2】:

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

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

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

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

【讨论】:

您的语法似乎有误。我不能让它像你一样工作。起作用的是:'db.punchdeck.findOne($query:, $orderby:$natural:-1)' 不确定,为什么所有的反对票 - 这段代码对我来说非常有效,而且速度很快 @dark_ruby 您查询返回错误“$err”:“无法规范化查询:BadValue 不支持的投影选项:排序: $natural:-1.0 ”,【参考方案3】:

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

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

也就是说,如果您使用 ObjectId 作为您的 ID,您也可以按 _id 排序。 See here for details。当然,即使这样也只好到最后一秒。

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

【讨论】:

我看到很多 noSQL 和 MongoDB 的解决方案都提倡“两次写入”,主要是针对数据量非常大的计数持有者。我猜这是常见的做法? MongoDB 不会经常刷新到磁盘并且它没有事务,因此写入变得明显更快。这里的权衡是鼓励您对通常导致多次写入的数据进行反规范化。当然,如果您获得 10 倍或 100 倍的写入吞吐量(我已经看到),那么 2 倍或 3 倍的写入仍然是一个很大的改进。【参考方案4】:

从 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: 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." 

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

我的解决方案:

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

【讨论】:

【参考方案7】:

这是从“foo”集合中的所有 MongoDB 文档中获取 last 记录的方法。(更改 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/

【讨论】:

【参考方案8】:

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

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

上面的查询会给出插入到集合中的最新文档的 _id

【讨论】:

【参考方案9】:

Mongo CLI 语法:

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

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于从 mongodb 集合中获取最新记录的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB复制集的工作原理介绍

使用limit和skip从mongoDB中的两个集合中获取记录

MongoDB:如何使用 _id 获取集合中的最新文档?

如何拦截和记录 mongodb 查询? [复制]

在MongoDB集合中获取第一个插入记录的最佳方法

无法使用 presto 从 mongodb 获取记录