【问题标题】:Implementing mongodb pagination along with match query?实现 mongodb 分页和匹配查询?
【发布时间】:2021-06-07 21:45:44
【问题描述】:

我有这样的用户文档

users = [
  {
    _id:'',
    name:'jay',
    email:'jay@gmail.com',
    role: 'actor',
    status: true // isActive
  },
  {
    _id:'',
    name:'ram',
    email:'ram123@gmail.com',
    role: 'electrician',
    status: false // isActive
  },
  ...... so on
]

我想应用分页和一些过滤器来检索数据

filter = {
  role: 'actor',
  order: -1 //descending sort,
  sortOn: 'name' // apply sort on name field
  search: 'ja', // match the string starting with 'ja',
  status: true,
  size:25,
  page: 1 // means documents from 1-25, page2 means 26-50
}

如何做到这一点? 我也在用猫鼬。

【问题讨论】:

    标签: node.js mongodb mongoose pagination aggregation-framework


    【解决方案1】:

    使用您的过滤器对象,您可以执行以下操作:

    使用这些步骤来确保良好的分页:

    1. 按任意值排序(以确保不会得到随机位置)
    2. 按页数跳过
    3. 受页面元素数量限制

    因此,查询将类似于(未经测试,但您可以看到想法):

    const elementsPerPage = filter.size
    const nSkip = elementsPerPage * filter.page
    const sort = {[filter.sortOn]:filter.order}
    YourModel.find({/*yourquery*/})
      .limit(elementsPerPage)
      .skip(nSkip)
      .sort(sort)
    

    此外,您可以在查询中使用 filter 值,例如:

    YourModel.find({
      role: filter.role, 
      status:filter.status,
      name:{ $regex: filter.search}
    })
    

    此查询类似于this 示例。

    此外,未定义您要使用什么计算、条件等,因此,您可以使用if/else 在查询中添加或不添加值。

    例如:

    var query = {}
    if(filter.search){
      query.name = {$regex: filter.search}
    }
    

    所以大家一起可以:

    const elementsPerPage = filter.size
    const nSkip = elementsPerPage * filter.page
    const sort = {[filter.sortOn]:filter.order}
    
    var query = {}
    if(filter.search){
      query.name = {$regex: filter.search}
    }
    if(filter.role){
      query.role = filter.role
    }
    if(filter.status){
      query.status = filter.status
    }
    
    YourModel.find(query)
      .limit(elementsPerPage)
      .skip(nSkip)
      .sort(sort)
    

    请注意,这尚未经过测试,但正如我之前所说,您可以通过此示例看到这个想法。

    【讨论】:

    • 非常感谢,我正在考虑这样的事情,但想确定这样做是否正确,非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2023-03-21
    • 1970-01-01
    • 2021-04-06
    • 2020-03-03
    • 2015-03-22
    相关资源
    最近更新 更多