gpt4 book ai didi

node.js - 如何使用官方mongodb客户端在node.js中实现mongodb分页?

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:00 24 4
gpt4 key购买 nike

我想为 mongodb 实现分页在 node.js使用环境offical mongodb package 。我试图在互联网上查找,但都是 mongoose基于链接。我不想使用 Mongoose 。

如何使用官方客户端 API 实现分页
http://mongodb.github.io/node-mongodb-native/3.1/api/

最佳答案

基于偏移量的方法有一个很大的缺陷:如果结果列表在 API 调用之间发生了变化,索引就会发生变化并导致某个项目返回两次或跳过并且永远不会返回

此问题的演示位于 https://www.sitepoint.com/paginating-real-time-data-cursor-based-pagination/

基于时间的分页方法会好一点,因为不再跳过结果。如果您查询第一页,然后删除一个新项目,它不会改变第二页中的结果,一切都很好。然而,这种方法有一个重大缺陷:如果同时创建多个项目怎么办?

最好是使用基于光标的分页
可以使用集合中任何唯一、可排序且不可变的字段来实现。

_id 满足所有唯一、可订购和不可变条件。基于这个字段我们可以排序并返回以最后一个文档的_id作为后续请求的cusror的页面结果。

curl https://api.mixmax.com/items?limit=2

const items = db.items.find({}).sort({
_id: -1
}).limit(2);

const next = items[items.length - 1]._id
res.json({ items, next })

当用户想要获取第二页时,他们将光标(如下所示)传递到 URL 上: curl https://api.mixmax.com/items?limit=2&next=590e9abd4abbf1165862d342

const items = db.items.find({
_id: { $lt: req.query.next }
}).sort({
_id: -1
}).limit(2);

const next = items[items.length - 1]._id
res.json({ items, next })

如果我们想以不同的顺序返回结果,例如项目的日期,那么我们将在查询字符串中添加 sort=launchDatecurl https://api.mixmax.com/items?limit=2&sort=launchDate

const items = db.items.find({}).sort({
launchDate: -1
}).limit(2);

const next = items[items.length - 1].launchDate;
res.json({ items, next })

用于后续页面请求
curl https://api.mixmax.com/items?limit=2&sort=launchDate&next=2017-09-11T00%3A44%3A54.036Z

const items = db.items.find({
launchDate: { $lt: req.query.next }
}).sort({
_id: -1
}).limit(2);

const next = items[items.length - 1].launchDate;
res.json({ items, next });

如果我们在同一天同一时间推出一堆产品怎么办?现在我们的 launchDate 字段不再是唯一的,并且不满足唯一、可订购和不可变。健康)状况。我们不能将它用作光标字段。但是我们可以使用两个字段来生成游标。因为我们知道 MongoDB 中的 _id 字段总是满足上述三个条件,所以我们知道如果我们将它与我们的 launchDate 一起使用> 字段,两个字段组合就可以满足要求,可以一起作为游标字段。curl https://api.mixmax.com/items?limit=2&sort=launchDate

const items = db.items.find({}).sort({
launchDate: -1,
_id: -1 // secondary sort in case there are duplicate launchDate values
}).limit(2);

const lastItem = items[items.length - 1];
// The cursor is a concatenation of the two cursor fields, since both are needed to satisfy the requirements of being a cursor field
const next = `${lastItem.launchDate}_${lastItem._id}`;
res.json({ items, next });

用于后续页面请求
curl https://api.mixmax.com/items?limit=2&sort=launchDate&next=2017-09-11T00%3A44%3A54.036Z_590e9abd4abbf1165862d342

const [nextLaunchDate, nextId] = req.query.next.split(‘_’);
const items = db.items.find({
$or: [{
launchDate: { $lt: nextLaunchDate }
}, {
// If the launchDate is an exact match, we need a tiebreaker, so we use the _id field from the cursor.
launchDate: nextLaunchDate,
_id: { $lt: nextId }
}]
}).sort({
_id: -1
}).limit(2);

const lastItem = items[items.length - 1];
// The cursor is a concatenation of the two cursor fields, since both are needed to satisfy the requirements of being a cursor field
const next = `${lastItem.launchDate}_${lastItem._id}`;
res.json({ items, next });

引用:https://engineering.mixmax.com/blog/api-paging-built-the-right-way/

关于node.js - 如何使用官方mongodb客户端在node.js中实现mongodb分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58219750/

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