在mongoDB的分页查询中我们一般会使用到limit skip sort,在这里我们以mongoose为例前端采用antd的table组件来完成一个列子。
首先只有分页的话我们在table组件的paginition中需要传递给后台的是当前页数,每条页数

data :{
limit: pagination.current,
page :pagination.pageSize,
}
后台接收到后以mongoose为例子
Model.find({}, null, {
limit,
skip: (page-1)*limit,
lean: true
})
但是在真实场景下我们也许还需要做一些sort或者filter的需求,在antd中实现如下图


当table 发生变化时我们有三个参数pagination, filters, sorter
我们直接把传递给后台
data :{
limit: pagination.current,
page :pagination.pageSize,
sortField: sorter.field,
sortOrder: sorter.order,
filter: filters
}
注意点:
- sortOrder传过来时会有'ascend' 'descend' false这三种但是mongoDB不支持ascend和descend所以我们需要切换
const sortOrder = sortOrder === 'ascend' ? 1 : 0;
- 可能filter从前台传递过来的是多条数据所以我们需要改造下
const newFilter={}
console.log(filter) // { Environment: [ 'PreProd', 'Production' ] }
if(filter){
for (let val of Object.entries(filter)){
console.log(val[1])
if(val[1].length !== 0) {
newFilter[val[0]] = {"$in": val[1]}
}
}
}
console.log(newFilter) // { Environment: { '$in': [ 'PreProd', 'Production' ] } }
- sort也是以对象形式传递
let sortObj = {}
sortObj[sortField] = sortOrder
最终
Model.find(newFilter, null, {
limit,
skip: (page-1)*limit,
lean: true,
sort: sortObj
})
网友评论