How to get the last N records in mongodb?
我无法找到任何记录在案的地方。 默认情况下,find()操作将从头开始获取记录。 我怎样才能获得mongodb中的最后N条记录?
编辑:我也希望返回的结果从最近到最近排序,而不是相反。
如果我理解你的问题,你需要按升序排序。
假设你有一些名为"x"的id或日期字段你会...
。分类()
1 | db.foo.find().sort({x:1}); |
1将按升序排序(从最旧到最新),-1将按降序排序(从最新到最旧)。
如果您使用自动创建的_id字段,则会在其中嵌入日期...因此您可以使用它来订购...
1 | db.foo.find().sort({_id:1}); |
这将返回从最旧到最新排序的所有文档。
自然秩序
您也可以使用上面提到的自然顺序......
1 | db.foo.find().sort({$natural:1}); |
同样,根据您想要的顺序使用1或-1。
使用.limit()
最后,在进行这种大开放查询时添加限制是一个好习惯,这样你就可以做到...
1 | db.foo.find().sort({_id:1}).limit(50); |
要么
1 | db.foo.find().sort({$natural:1}).limit(50); |
使用此查询可以看到最近N个添加的记录,从最近到最近的记录:
1 | db.collection.find().skip(db.collection.count() - N) |
如果你想以相反的顺序:
1 | db.collection.find().sort({ $natural: -1 }).limit(N) |
如果您安装Mongo-Hacker,您还可以使用:
1 | db.collection.find().reverse().limit(N) |
如果您厌倦了编写这些命令,您可以在?/ .mongorc.js中创建自定义函数。例如。
1 2 3 | function last(N) { return db.collection.find().skip(db.collection.count() - N); } |
然后从mongo shell中输入
为了获得最后N条记录,您可以执行以下查询:
1 | db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber) |
如果你只想要最后一条记录:
1 | db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}}) |
注意:您可以使用集合中的一列来代替$ natural。
您可以使用
1 | db.collections.find().sort(key:value).limit(int value).skip(some int value); |
您不能根据集合的大小"跳过",因为它不会考虑查询条件。
正确的解决方案是从所需的终点进行排序,限制结果集的大小,然后根据需要调整结果的顺序。
这是一个基于真实世界代码的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N); query.exec(function(err, results) { if (err) { } else if (results.length == 0) { } else { results.reverse(); // put the results into the desired order results.forEach(function(result) { // do something with each result }); } }); |
查看查询:排序和自然顺序,http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order
以及Cursor方法下的sort()
http://www.mongodb.org/display/DOCS/Advanced+Queries
你可以试试这个方法:
获取集合中的记录总数
1 | db.dbcollection.count() |
然后使用skip:
1 | db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty() |
排序,跳过等可能会非常慢,具体取决于您的集合的大小。
如果您按照某些标准对集合进行索引,则可以获得更好的性能;然后你可以使用min()游标:
首先,使用
您可以使用升序或降序,这很酷,因为您总是希望"N个最后项目"...所以如果您按降序索引它与获取"前N个项目"相同。
然后,您可以找到集合中的第一个项目,并将其索引字段值用作搜索中的最小条件,如:
1 | db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N) |
这是min()游标的参考:https://docs.mongodb.com/manual/reference/method/cursor.min/
@斌臣,
您可以将聚合用于集合中文档子集的最新n个条目。这是一个没有分组的简化示例(在这种情况下,您将在第4和第5阶段之间进行分组)。
这将返回最新的20个条目(基于名为"timestamp"的字段),按升序排序。然后它将每个文档_id,timestamp和whatever_field_you_want_to_show投影到结果中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | var pipeline = [ { "$match": { //stage 1: filter out a subset "first_field":"needs to have this value", "second_field":"needs to be this" } }, { "$sort": { //stage 2: sort the remainder last-first "timestamp": -1 } }, { "$limit": 20 //stage 3: keep only 20 of the descending order subset }, { "$sort": { "rt": 1 //stage 4: sort back to ascending order } }, { "$project": { //stage 5: add any fields you want to show in your results "_id": 1, "timestamp" : 1, "whatever_field_you_want_to_show": 1 } } ] yourcollection.aggregate(pipeline, function resultCallBack(err, result) { // account for (err) // do something with (result) } |
所以,结果看起来像:
1 2 3 4 5 6 7 8 9 10 | { "_id" : ObjectId("5ac5b878a1deg18asdafb060"), "timestamp" :"2018-04-05T05:47:37.045Z", "whatever_field_you_want_to_show" : -3.46000003814697 } { "_id" : ObjectId("5ac5b878a1de1adsweafb05f"), "timestamp" :"2018-04-05T05:47:38.187Z", "whatever_field_you_want_to_show" : -4.13000011444092 } |
希望这可以帮助。
您可能想要使用
http://docs.meteor.com/api/collections.html#Mongo-Collection-find
1 | db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch(); |
使用$ slice运算符来限制数组元素
1 2 3 4 5 6 7 | GeoLocation.find({},{name: 1, geolocation:{$slice: -5}}) .then((result) => { res.json(result); }) .catch((err) => { res.status(500).json({ success: false, msg: `Something went wrong. ${err}` }); }); |
geolocation是数据数组,我们得到最后5条记录。
1 | db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n) |
根据mongoDB文档:
You can specify { $natural : 1 } to force the query to perform a forwards collection scan.
You can also specify { $natural : -1 } to force the query to perform a reverse collection scan.
最后一个函数应该是
例:
1 | db.testcollection.find().limit(3).sort({timestamp:-1}); |