我找不到任何地方有这样的记录。默认情况下,find()操作将从头获取记录。我怎么能得到mongodb的最后N条记录?
编辑:我也想返回的结果从最近到最近的顺序,而不是相反。
我找不到任何地方有这样的记录。默认情况下,find()操作将从头获取记录。我怎么能得到mongodb的最后N条记录?
编辑:我也想返回的结果从最近到最近的顺序,而不是相反。
当前回答
最后一个函数应该是sort,而不是limit。
例子:
db.testcollection.find().limit(3).sort({timestamp:-1});
其他回答
您不能根据集合的大小“跳过”,因为它不会考虑查询条件。
正确的解决方案是从期望的端点开始排序,限制结果集的大小,然后在必要时调整结果的顺序。
下面是一个基于实际代码的示例。
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
});
}
});
最后添加的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中创建自定义函数。如。
function last(N) {
return db.collection.find().skip(db.collection.count() - N);
}
然后在mongo shell中输入last(N)
你可能想要使用find选项: http://docs.meteor.com/api/collections.html#Mongo-Collection-find
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
查看查询:排序和自然顺序,http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order 以及游标方法下的sort() http://www.mongodb.org/display/DOCS/Advanced+Queries
@bin-chen,
可以对集合中文档子集的最新n个条目使用聚合。下面是一个没有分组的简化示例(在本例中,您将在阶段4和阶段5之间进行分组)。
这将返回最新的20个条目(基于一个称为“时间戳”的字段),按升序排序。然后它将每个文档_id、时间戳和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
}
希望这能有所帮助。