当前位置: 首页 > 知识库问答 >
问题:

MongoDB:如何使用_id获取集合中的最新文档?

赫连晋
2023-03-14

如何使用_id检索在我的收藏中创建的最新文档?

我试图通过以下方式在我的Web应用程序中实现分页:

  1. 正在检索我页面加载的最后一个文档的_id
  2. 在下一页中检索大于最后一个文档_id的文档(http://tldrify.com/dcj)

我采用这种方法的原因是,我试图利用存储数据中的自然顺序——文档中存储的id。

获取下一组帖子的示例:

Posts.find({ _id : { $gt : lastObjectId } }, function(){
  if(error){
    console.log('error in get_next_posts');
  } else {
    response.json(results);
  }
}).limit(5)

我的猫鼬模式:

var PostSchema = new mongoose.Schema({
  upvotes: {type: Number, default: 0},
  comments: Array,
  imageURI: String,
  caption: String,
  location: Object,
  hashtag: String
});

据我所知,Mongo的文件已经按照以下文件从最旧到最新排序:

"MongoDB在创建集合时为所有集合创建_id索引,这是_id字段上的升序唯一索引。(https://docs.mongodb.org/v3.0/core/index-single/)"

在把几篇帖子推到我的mongoDB数据库(该数据库位于Heroku上)之后,一切都很顺利(似乎是按升序发布的)

Post1 id --- 56756e2047b977030017b36d
Post2 id --- 56756e4f47b977030017b36e
Post3 id --- 56756e8447b977030017b36f
Post4 id --- 56756ef747b977030017b370
Post5 id --- 56756f3f47b977030017b371
Post6 id --- 56756f7247b977030017b372

但是在将我的第7和第8个帖子添加到集合后,我的Mongo数据库似乎突然停止了按升序对帖子进行排序,这意味着我不能再使用我以前的猫鼬查询。

我不知道为什么在我的数据库上发了几篇帖子之后,升序就停止了——有人知道为什么吗?

Post1 id --- 56756e2047b977030017b36d
Post7 id --- 5675727647b977030017b374   <-- why are they here now?
Post8 id --- 5675744847b977030017b375   <--
Post2 id --- 56756e4f47b977030017b36e
Post3 id --- 56756e8447b977030017b36f
Post4 id --- 56756ef747b977030017b370
Post5 id --- 56756f3f47b977030017b371
Post6 id --- 56756f7247b977030017b372

更新:这就是我最终通过_id获得最老帖子的原因:

Post.find({}, function(error, results) {
  if(error) {
    console.log('error in show');
  } else {
    console.log('show query successful');
    response.json(results);
  }
}).sort({_id:1})

共有3个答案

金霄
2023-03-14

“永远不要重新计算你能预计算的东西”。

维护一个单独的字段“last_added”,每当创建新帖子时,将该帖子的_id存储到该字段中。因此,使用该id检索上次添加的帖子的详细信息会更容易

蓬琦
2023-03-14

不管数据库显示什么,如果你看到那些十六进制的id,它们是以数字的升序排列的
如果希望在页面中使用服务器端分页,可以这样做

Posts.find({
    deleted: false
}).skip(skips).limit(limits).sort({_id:1}).exec(function (err, objects) {
    callback(null, objects);
})

跳过意味着你跳过了多少页面。如果你在1页和5页需要5条记录意味着搜索下一页记录你的跳过我们将5,使前5条记录跳过

限制意味着你一次需要多少元素。

然后sort({u id:1}表示升序排序,sort({u id:-1})表示降序排序

汪理
2023-03-14

我不认为它只能通过使用Mongo id来实现。mongo id是根据时间、连接id和其他一些东西计算的,因此不能保证它与创建时间成线性。

https://docs.mongodb.org/v3.0/reference/object-id/

 类似资料:
  • 我有一个名为product的MongoDB集合,其中包含以下文档,如下所示。 我想查询收款情况,只退回价格最低的单据,例如: 但当我运行聚合查询时: 它只返回一个文档。

  • 多亏了这里的人的帮助,我成功地在我的文档中找到了两个ID,并在另一个集合中找到了他们的代表文档。我需要采取的下一步是进一步查找一个“嵌套”ID(引用另一个集合中的文档)。 其结果如下: 我希望chieftain部分是这样的(这就是没有添加'last'$lookup'的chieftain文档的样子):

  • 如何将最新文档插入(一个独立的、没有RS的)MongoDb,而不是现有的集合? 如何在文档之后插入所有文档?

  • 问题内容: 我的数据如下所示: 我想获取每个会话中最大的(按年龄)的所有行。因此,对于上述输入,我的输出如下所示: 因为约翰在会话= 1组中年龄最大,而汤米在会话= 2组中年龄最大。 我需要将结果导出到文件(csv),并且其中可能包含很多记录。 我该如何实现? 问题答案: 您可以尝试以下使用max属性的聚合查询:http : //docs.mongodb.org/manual/reference/

  • 正确的解决方案是publisher_id具有12字节的BSON对象ID吗?

  • 我有用于数据库的Spring Boot App和MongoDB。 在数据库中,我有一个集合packageholiday,其中有一些元素,这是JSON: 我的目标是什么: 正如你们所见,我在集合中有这样的数组: 所以我的问题实际上是创建API,它将从集合中返回具有指定的元素。 例如 的API 例如,对于相同的 的API 我怎样才能做到这一点?这样可能吗?