如何获得mongodb中的最后N条记录?

我找不到任何地方有这样的记录。默认情况下,find()操作将从头获取记录。我怎么能得到mongodb的最后N条记录?

编辑:我也想返回的结果从最近到最近的顺序,而不是相反。

684782 次浏览

查看查询:排序和自然顺序,http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order 以及游标方法下的sort() # EYZ0 < / p >

如果我理解了你的问题,你需要按升序排序。

假设你有一些id或日期字段称为“x”,你会做…

.sort ()


db.foo.find().sort({x:1});

1将升序排序(从最老到最新),-1将降序排序(从最新到最老)。

如果你使用自动创建的_id字段,它有一个日期嵌入其中…所以你可以用它来订购…

db.foo.find().sort({_id:1});

这将返回从最老到最新排序的所有文档。

自然秩序


你也可以使用上面提到的自然秩序

db.foo.find().sort({$natural:1});

同样,根据你想要的顺序使用1-1

使用.limit ()


最后,在执行这种广泛开放的查询时添加一个限制是一个很好的实践,这样你就可以这样做…

db.foo.find().sort({_id:1}).limit(50);

db.foo.find().sort({$natural:1}).limit(50);

你可以使用sort(),# EYZ1,skip()从任何跳过的值开始获得最后N个记录

db.collections.find().sort(key:value).limit(int value).skip(some int value);

最后一个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)

为了得到最近的N条记录,你可以执行以下查询:

db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)

如果你只想要最后一张唱片:

db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})

注意:您可以使用集合中的一列来代替$natural

最后一个函数应该是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
});
}
});
你可能想使用find选项: # EYZ0 < / p >
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();

@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
}

希望这能有所帮助。

db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)

根据mongoDB文档:

您可以指定{$natural: 1}强制查询执行转发集合扫描。

您还可以指定{$natural: -1}来强制查询执行反向收集扫描。

使用$slice操作符限制数组元素

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条记录。

根据集合的大小,排序、跳过等操作可能会非常慢。

如果您根据某些标准对集合进行索引,则可以获得更好的性能;然后你可以使用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/

你可以试试这个方法:

获取集合中记录的总数

db.dbcollection.count()

然后使用skip:

db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()

如果你使用MongoDB compass,你可以使用sort field来过滤,

enter image description here

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

使用.sort ().limit ()

按升序或降序使用Sort,然后使用limit

db.collection.find({}).sort({ any_field: -1 }).limit(last_n_records);