猫鼬中的<div id="tbvAccountProc">
<div id="frmFinancingDocumentProcess">
<a id="btnSave" />
</div>
</div>
的问题在于,在向集合中添加数据时,.skip(num)
可能返回先前搜索中存在的数据。一种解决方案是从_id跳过,但是我找不到这样的选项。
因此,而不是:
skip(num)
我希望能够:
db.collection.find().sort({ _id: -1 }).skip(num).limit(50);
或者,如果我能得到db.collection.find().sort({ _id: -1 }).skip(_id).limit(50);
的索引,也应该没问题:
_id
我使用Caffeinated.tech的方法并尝试:
let res = await db.collection.findOne({_id});
let {index} = res;
db.collection.find().sort({ _id: -1 }).skip(index).limit(50);
我知道了
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"
答案 0 :(得分:0)
如果您想在分页查询时避免重复,我建议在gt
查询中使用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-fast-pagination会使它变得更容易。