Mongoose如何直接查询过滤文档内users数组并返回指定范围元素
解决方案
可以直接使用MongoDB内置的$slice投影运算符,在数据库查询阶段直接完成数组切片,无需返回全量users数组,完美解决大数组场景下的服务端性能问题。
代码实现
单条查询(推荐,单个房间场景用findOne性能更好)
roommodel.findOne( { roomname: 'room1' }, // $slice第一个参数为跳过的元素个数,第二个参数为返回的元素个数 { users: { $slice: [1, 4] } } ).then(res => { const filteredusers = res.users // 直接得到 ['name2', 'name3', 'name4', 'name5'] console.log(filteredusers) })
批量查询场景
roommodel.find( { roomname: 'room1' }, { users: { $slice: [1, 4] }, _id: 0 } ).then(res => { const filteredusers = res[0].users console.log(filteredusers) })
$slice参数说明
- 传入单个正整数:返回数组前N个元素,例
$slice:3返回前3个元素 - 传入单个负整数:返回数组后N个元素,例
$slice:-2返回最后2个元素 - 传入
[skip, count]数组:跳过前skip个元素,返回接下来的count个元素,完全匹配JavaScript中slice(start, end)的切片逻辑,注意原业务需要返回name2到name5共4个元素,所以count取值为4。
内容的提问来源于stack exchange,提问作者Santosh Jugjali
相关产品推荐
相关产品推荐

