mongodb:如何得到最后的N个logging?

我找不到任何地方已经logging了这一点。 默认情况下,find()操作将从头开始获取logging。 如何获得mongodb中的最后N个logging?

编辑:我也希望返回的结果从最近到最近sorting,而不是相反。

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

假设你有一些名为“X”的ID或date字段,你会做…

。分类()


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

1将按升序(从最旧到最新)sorting, -1将按降序排列(从最新到最旧)。

如果您使用自动创build_id字段它有一个embedded的date…所以你可以使用它来订购…

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

这将返回从最旧到最新sorting的所有文档。

自然顺序


您也可以使用上面提到的自然顺序 …

 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); 

使用此查询可以看到最近N个添加的logging,从不新近到最新的logging:

 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中创build自定义函数。 例如

 function last(N) { return db.collection.find().skip(db.collection.count() - N); } 

然后从一个mongo shell中inputlast(N)

为了得到最后的N条logging,你可以执行下面的查询:

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

如果你只想要最后一个logging:

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

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

您可以使用sort()limit()skip()从任何跳过的值中获取最后一个Nlogging

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

您不能根据集合的大小“跳过”,因为它不会考虑查询条件。

正确的解决scheme是从所需的终点进行sorting,限制结果集的大小,然后根据需要调整结果的顺序。

这里是一个基于真实代码的例子。

 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 }); } }); 

最后的function应该是sort ,而不是limit

例:

 db.testcollection.find().limit(3).sort({timestamp:-1});