如何用猫鼬从_id跳过?

时间:2019-01-03 08:59:02

标签: mongoose

猫鼬中的<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"

1 个答案:

答案 0 :(得分:0)

如果您想在分页查询时避免重复,我建议在gt查询中使用ltwhere,而不要使用skiplimit 。即使页面中有成千上万的文档,这也可以使您保持恒定的速度(随着skip值变大,查询变慢)。

以下是基本概念:

我在通讯录中列出联系人。我已经加载并显示了前100个联系人,并按createdAt日期升序排序并搜索了名称aero

  1. 从您的UI / API /发送当前显示的最后一个联系人的ID,以及当前的排序/搜索参数。

  2. 从数据库加载所述联系人。例如,它是name: "aero 100"和`createdAt:“ 01/01/2019”

  3. 现在使用此联系人构造查询,以便您在此联系人之后的下一个联系人继续。因此,您将要搜索相同的名称,并且在我们按创建时进行排序时,添加此排序顺序 并搜索其中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会使它变得更容易。