mongoose - 如何用猫鼬跳过_id?
问题描述
mongoose的问题.skip(num)
在于,在向集合中添加数据时,skip(num)
可能会返回先前搜索中存在的数据。解决方案将从 _id 中跳过,但我找不到这样的选项。
所以而不是:
db.collection.find().sort({ _id: -1 }).skip(num).limit(50);
我希望能够:
db.collection.find().sort({ _id: -1 }).skip(_id).limit(50);
或者,如果我能得到它的索引_id
也应该没问题:
let res = await db.collection.findOne({_id});
let {index} = res;
db.collection.find().sort({ _id: -1 }).skip(index).limit(50);
我使用 Caffeinated.tech 的方法并尝试过:
const list = async function({
end_cursor = ''
} = {}) {
return await db.discovery.where('_id').gt(end_cursor).sort({ _id: -1 }).limit(50);
}
我得到了
CastError: Cast to ObjectId failed for value "" at path "_id" for model "discovery"
正确答案是
const list = async function(end_cursor) {
if (!end_cursor) {
return await db.discovery.where('_id').sort({ _id: -1 }).limit(50);
}
return await db.discovery.where('_id').lt(end_cursor).sort({ _id: -1 }).limit(50);
}
解决方案
如果您想在对查询进行分页时避免重复,我建议您在查询中使用gt
and而不是使用and 。这还具有为您提供恒定速度的好处,即使您在页面下方有数千个文档(随着值越大,查询越慢)。lt
where
skip
limit
skip
这是一般的想法:
我正在通讯录中列出联系人。我已经加载并显示了前 100 个联系人,按createdAt
日期升序排序并搜索名称aero
。
从您的 UI / API / 发送当前显示的最后一个联系人的 id 以及当前的排序/搜索参数。
从数据库加载所述联系人。例如它是
name: "aero 100"
和`createdAt:“01/01/2019”现在使用此联系人构建您的查询,以便您在此联系人之后继续下一个联系人。因此,您将要搜索相同的姓名,并且由于我们按创建的排序方式添加此排序顺序并搜索
createdAt
大于最后一个联系人createdAt
时间戳的联系人。
let lastContact = await Contact.findById(lastId)
let nextPage = await Contact
.where({ name: /aero/i })
.sort({createdAt: 1})
.gt(createdAt, lastContact.createdAt)
.limit(100)
.exec()
我已经发布了一个用于 mongoose 的插件,除非您需要执行一些复杂的查询/填充等,否则它应该会更容易:mongoose-fast-pagination。
推荐阅读
- c++ - 在类中没有使用 C++ 线程的类型名称“类型”
- c# - 如何解决我以下语句的问题:“当内存达到 4 GB 时项目崩溃”
- knockout.js - KnockoutJS - Computed Observables 不绑定到输入
- c# - 如何在 vscode 中使用 ILmerge?(C#)
- google-sheets - 使用 FILTER 和 IMPORTRANGE 删除空白行
- salesforce - 从 ADF 中的 Salesforce Marketing Cloud 连接器检索 _Data 视图
- ip - 如何将子域指向 IP 地址?
- pandas - 从返回 8 个值的函数创建数据框
- typescript - 当单击商店中的数据时,我想要一个进度条来更改更新值
- excel - 从网页到 Google 表格的网络抓取特定值