Mongoose链式查询方法调用顺序是否重要?如何先限制再排序?
Mongoose查询顺序与先限制后排序的实现
关于查询顺序的结论
你的结论是正确的。Mongoose的链式调用只是构建查询的语法糖,最终会转换成MongoDB的原生查询指令,而MongoDB对查询的执行顺序是固定的:先执行find过滤文档,再执行sort排序,最后执行limit限制结果数量。所以不管你在代码里调换sort()和limit()的调用顺序,最终生成的查询逻辑都是一致的,返回结果自然相同。
先限制结果再排序的实现方法
如果要实现先取指定数量的文档,再对这些文档排序,需要使用MongoDB的聚合管道(Aggregation Pipeline),因为聚合管道的阶段是按顺序依次执行的。具体代码如下:
const result = await statusModel.aggregate([ // 第一步:先过滤文档(和find的filter逻辑一致) { $match: filter }, // 第二步:限制返回的文档数量 { $limit: limit }, // 第三步:对已限制数量的文档排序 { $sort: { _id: 'desc' } } ]) return { result, count: result.length }
需要注意的是,这种先限制再排序的逻辑和常规的先排序再限制有本质区别:前者是从过滤后的文档里按默认存储顺序取limit条,再排序;后者是先把所有过滤后的文档排序,再取前limit条,业务场景完全不同,使用时要根据需求选择。
内容的提问来源于stack exchange,提问作者Hawkeyebrow
相关产品推荐
相关产品推荐

