node.js - 实现 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
}
如何做到这一点?我也在使用猫鼬。
解决方案
使用您的过滤器对象,您可以执行以下操作:
使用这些步骤来确保良好的分页:
- 按任意值排序(以确保不会得到随机位置)
- 按页数跳过
- 受页面元素数量限制
因此,查询将类似于(未经测试,但您可以看到这个想法):
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)
请注意,这尚未经过测试,但正如我之前所说,您可以通过此示例看到这个想法。
推荐阅读
- python - 如何编辑原始值?
- python - 'FileDataset' 对象没有属性 'DoseGrid'
- typescript - 如何获取任何构造函数类型并将其转换为接受相同参数的函数类型?
- c++ - QtCreator GDB 找不到正确的共享库
- c# - 如何在 C# 中使用 foreach 循环向声明数组添加新声明?
- python - 具有对象类型的 Pandas 均值方法变为 NaN
- maven - 来自配置文件的 Maven 命令行选项
- swift - SwiftUI - ScrollView: onChange -> scrollTo 截断文本
- amazon-web-services - 创建 Elastic Beanstalk 应用程序失败
- python - 我试图在笔和纸上找到以下 python 列表理解的输出(试运行)