gpt4 book ai didi

javascript - MongoDB分页的范围查询

转载 作者:IT老高 更新时间:2023-10-28 11:04:18 25 4
gpt4 key购买 nike

我想在 MongoDB 上实现分页。对于我的范围查询,我考虑过使用 ObjectID:

db.tweets.find({ _id: { $lt: maxID } }, { limit: 50 })

但是,according to the docs ,ObjectID的结构意味着“ObjectId值不代表严格的插入顺序”:

The relationship between the order of ObjectId values and generation time is not strict within a single second. If multiple systems, or multiple processes or threads on a single system generate values, within a single second; ObjectId values do not represent a strict insertion order. Clock skew between clients can also result in non-strict ordering even for values, because client drivers generate ObjectId values, not the mongod process.

然后我想到了用时间戳查询:

db.tweets.find({ created: { $lt: maxDate } }, { limit: 50 })

但是,不能保证日期是唯一的 - 很可能会在同一秒内创建两个文档。这意味着分页时可能会丢失文档。

是否有任何种类的范围查询可以为我提供更高的稳定性?

最佳答案

尽管您的分页语法错误,但使用 ObjectId() 非常好。你想要:

 db.tweets.find().limit(50).sort({"_id":-1});

这表示您想要按 _id 值降序排序的推文,并且您想要最近的 50 个。您的问题是,当当前结果集发生变化时分页很棘手 - 所以而不是使用跳过下一页,您要记下结果集中最小的 _id (第 50 个最近的 _id 值,然后获取下一页:

 db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});

这将为您提供下一个“最新”推文,而不会有新的推文扰乱您的分页。

完全不用担心 _id 的值是否严格对应于插入顺序——它会足够接近 99.999%,而且没有人真正关心亚秒级的推文来了首先 - 你甚至可能会注意到 Twitter 经常显示乱序的推文,这并不重要。

如果它很关键,那么您将不得不使用相同的技术,但使用“tweet date”,其中该日期必须是时间戳,而不仅仅是日期。

关于javascript - MongoDB分页的范围查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com