首页 > 解决方案 > 实现 mongodb 分页和匹配查询?

问题描述

我有这样的用户文档

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.jsmongodbmongoosepaginationaggregation-framework

解决方案


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

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

  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}
})

此查询类似于示例。

此外,未定义您要使用什么计算、条件等,因此,您可以使用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)

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


推荐阅读