如何修复Mongoose关联查询嵌套排序失效问题
问题解决方法
你遇到的问题根源在于:Mongoose的populate操作是分两步执行的——先查询channels集合获取所有渠道文档,再根据每个渠道的user_id去查询关联的用户文档并填充。你写的sort({ 'user_id.updated_at': -1 })是作用于第一步的MongoDB查询,但channels集合中并没有user_id.updated_at这个嵌套字段,所以这个排序条件不会生效。
如果不想使用aggregate,可以通过查询后在内存中排序的方式解决:
// 先查询并填充关联的用户数据 const channels = await Channels.find().populate('user_id'); // 在内存中按关联用户的updated_at倒序排序 channels.sort((channelA, channelB) => { return channelB.user_id.updated_at.getTime() - channelA.user_id.updated_at.getTime(); });
注意事项
- 这种方式是在Node.js内存中对查询结果进行排序,如果你的
channels数据量极大,可能会带来性能开销,此时还是建议使用聚合查询。 - 确保
populate成功获取到了用户的updated_at字段,否则排序会报错,可以在populate中指定需要的字段优化性能:Channels.find().populate({ path: 'user_id', select: 'updated_at' })
内容的提问来源于stack exchange,提问作者Erdem Ün
相关产品推荐
相关产品推荐

