为什么slice()方法无法作用于MongoDB find()返回的结果?
问题产生原因
核心原因是db.todos.find()的返回值根本不是普通JavaScript数组,而是Mongosh内置的游标(Cursor)对象,两类对象的方法逻辑完全不通用:
- 测试用的
[{title: '111'}, {title: '222'}]是标准JS数组,forEach()、slice()都是数组原型上的原生方法,调用后自然按照数组逻辑正常返回结果。 - 游标对象单独实现了和数组同名的
forEach()方法:调用时会自动迭代游标拉取到的所有匹配文档,逐个传入回调执行,行为和数组的forEach高度相似,很容易让人误以为返回值是普通数组。 - 游标对象本身没有实现和数组逻辑一致的
slice()方法,直接对游标调用slice()不会触发数据集截取逻辑,自然得不到和数组调用slice一样的效果。
正确截取游标的方案
如果要实现slice(0,1)取第一条匹配结果的效果,有两种常用写法:
- 直接用游标原生提供的分页方法,不需要加载全量匹配数据,性能更好:
// 取匹配条件的第一条结果 db.todos.find().limit(1)
- 先把游标返回的所有结果转为真正的JS数组,再调用数组原生的slice方法,适合需要对结果做多种数组操作的场景:
// 转成纯数组后再做截取 db.todos.find().toArray().slice(0,1)
内容的提问来源于stack exchange,提问作者Edward Tanguay
相关产品推荐
相关产品推荐

