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

时间:2015-12-19 17:07:02

标签: mongodb mongoose database nosql

如何使用_id检索我的集合中创建的最新文档?

我正在尝试通过以下方式在我的网络应用程序中实现分页:

  1. 检索我页面中加载的最后一个文档的_id
  2. 检索下一页中最后一个文档的“_id”以上的文档 (http://tldrify.com/dcj
  3. 我采用这种方法的原因是因为我试图利用存储数据中的自然顺序 - 存储在文档中的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数据库突然停止按升序对帖子进行排序,这意味着我无法再使用以前的mongoose查询。

    我不确定为什么在我的数据库发布一些帖子后,升序才停止 - 任何人都知道为什么?

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

2 个答案:

答案 0 :(得分:1)

我认为只有使用Mongo id才能实现。 mongo id是根据时间,连接ID和其他一些东西计算的,因此它不能保证与创建时间呈线性关系。

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

答案 1 :(得分:0)

“永远不要重新计算您可以预先计算”。

维护一个单独的字段“ last_added”,每当创建新帖子时,将该帖子的_id存储到该字段中。 因此,使用_id

检索上一次添加的帖子的细节将更加容易