我找不到任何记录在案的地方。默认情况下,find()操作将从头开始获取记录。我怎样才能获得mongodb中的最后N条记录?
编辑:我也希望返回的结果从最近的到最近的,而不是相反的。
答案 0 :(得分:625)
如果我理解你的问题,你需要按升序排序。
假设你有一些名为“x”的id或日期字段,你会这样做......
db.foo.find().sort({x:1});
1 将按升序排序(从最旧到最新), -1 将按降序排序(从最新到最旧)。
如果您使用自动创建的 _id 字段,则会在其中嵌入日期...因此您可以使用该字段进行排序...
db.foo.find().sort({_id:1});
这将返回从最旧到最新排序的所有文档。
您还可以使用上面提到的Natural Order ...
db.foo.find().sort({$natural:1});
再次使用 1 或 -1 ,具体取决于您想要的顺序。
最后,在进行这种大开放式查询时添加限制是一个好习惯,这样你就可以做...
db.foo.find().sort({_id:1}).limit(50);
或
db.foo.find().sort({$natural:1}).limit(50);
答案 1 :(得分:100)
此查询可以看到最近 N 添加的记录,从最近的到最近的记录:
db.collection.find().skip(db.collection.count() - N)
如果您想要它们的顺序相反:
db.collection.find().sort({ $natural: -1 }).limit(N)
如果您安装Mongo-Hacker,也可以使用:
db.collection.find().reverse().limit(N)
如果您厌倦了编写这些命令,您可以在〜/ .mongorc.js中创建自定义函数。 E.g。
function last(N) {
return db.collection.find().skip(db.collection.count() - N);
}
然后从mongo shell中输入last(N)
答案 2 :(得分:13)
为了获得最后N条记录,您可以执行以下查询:
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
如果您只想要最后一条记录:
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
注意:您可以使用系列中的一列来代替$ natural。
答案 3 :(得分:6)
您可以使用sort()
,limit()
,skip()
从任何跳过的值中获取最后N条记录
db.collections.find().sort(key:value).limit(int value).skip(some int value);
答案 4 :(得分:5)
查看“查询:排序和自然顺序”,http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order 以及Cursor方法下的sort() http://www.mongodb.org/display/DOCS/Advanced+Queries
答案 5 :(得分:5)
你不能跳过"基于集合的大小,因为它不会考虑查询条件。
正确的解决方案是从所需的终点进行排序,限制结果集的大小,然后根据需要调整结果的顺序。
以下是一个基于真实世界代码的示例。
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
});
}
});
答案 6 :(得分:4)
您可以尝试以下方法:
通过
获取集合中的记录总数。db.dbcollection.count()
然后使用跳过:
db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
答案 7 :(得分:3)
根据集合的大小,排序,跳过等操作可能会非常慢。
如果按某些条件对集合进行索引,则可以实现更好的性能;然后您可以使用min()光标:
首先,使用db.collectionName.setIndex( yourIndex )
为您收集的索引
您可以使用升序或降序,这很酷,因为您始终希望“ N个最后一项” ...因此,如果按降序索引,则与获取“前N个项”相同。
然后,您找到集合的第一项并将其索引字段值用作搜索中的最低标准,例如:
db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)
以下是min()光标的参考:https://docs.mongodb.com/manual/reference/method/cursor.min/
答案 8 :(得分:2)
您可能希望使用find
选项:
http://docs.meteor.com/api/collections.html#Mongo-Collection-find
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
答案 9 :(得分:2)
@仓辰
您可以将聚合用于集合中文档子集的最新n个条目。这是一个没有分组的简化示例(在这种情况下,您将在第4和第5阶段之间进行分组)。
这将返回最新的20个条目(基于名为"时间戳"的字段),按升序排序。然后它将每个文档_id,timestamp和whatever_field_you_want_to_show投影到结果中。
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)
}
所以,结果看起来像是:
{
"_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
}
希望这有帮助。
答案 10 :(得分:1)
db.collection.find().sort({$natural: -1 }).limit(5)
答案 11 :(得分:0)
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)
您可以指定{$ natural:1}来强制查询执行转发集合扫描。
您还可以指定{$ natural:-1}来强制查询执行反向集合扫描。
答案 12 :(得分:0)
使用 $ slice 运算符限制数组元素
Range("J12:J18").Select
其中,地理位置是数据数组,从中我们得到最后5条记录。
答案 13 :(得分:0)
答案 14 :(得分:-4)
最后一项功能应该是sort
,而不是limit
。
示例:
db.testcollection.find().limit(3).sort({timestamp:-1});