db.collection(dbname_archives).aggregate().match(whereDic).sort({_id:-1}).skip(num).limit(30)
whereDic 也是能做筛选的都加进入了
num 超过一定的量,就会提示超过最大排序内存 最大排序内容为100MB,
用户操作也是点击分页,所以skip 省不了
![代码与梦想](http://img-cdn-tc.dcloud.net.cn/uploads/avatar/000/91/42/74_avatar_mid.jpg?v=1688106242)
代码与梦想
- 发布:2023-08-23 12:01
- 更新:2023-08-23 12:11
- 阅读:256
![用户7810](http://img-cdn-tc.dcloud.net.cn/uploads/avatar/001/05/62/91_avatar_mid.jpg?v=1689137674)
您应该避免使用where+skip+limit的查询方式来遍历整个集合,因为这种方式随着Skip数量的增长响应时间会越来越慢,还可能会造成请求超时。
下面的代码给出了一个示例。为避免示例过于复杂,先假设没有两条记录的create_date是相等,如果create_date不能唯一标识数据,可以再额外加入其他字段,比如文章作者等
按照create_date(创建时间)降序排序,每次查询时都指定查询条件小于上次查询结果中的最后一条记录的create_date,这样不需要使用skip即可实现分页效果,同时还能保证用户在上下翻页的时候不会因为出现新增数据而引起的前后两页数据重复的问题
const db = uniCloud.database()
const dbCmd = db.command
module.exports = async function(event,context) {
const {
lastCreateDate = Date.now(),
pageSize
} = event
if(pageSize > 100){
throw new Error('单页数据不可超过100条')
}
const res = await db.collection('book').where({
create_date: dbCmd.lt(lastCreateDate)
})
.limit(pageSize)
.get()
}
代码与梦想 (作者)
现在需求是 where已经把能加的条件加过了,是因为skip 过大 加上sort 排序造成的内存问题,有没有其他方法解决 么有只能限制用户行为了
2023-08-23 15:30