如何在Mongoose中对文档内部的嵌套数组按指定字段排序?
Mongoose 子文档数组按addedAt字段排序实现方案
方案1:数据库层面聚合排序(推荐,适合数组元素量大的场景)
直接在查询阶段通过MongoDB聚合完成排序,避免全量加载到应用层占用内存,已兼容空数组场景:
const mongoose = require('mongoose') const Preference = require('./你的Preference模型路径') const sortedPreference = await Preference.aggregate([ // 匹配对应用户的唯一偏好文档 { $match: { user: mongoose.Types.ObjectId(当前登录用户ID) } }, // 拆分article数组,保留空数组情况避免丢失文档 { $unwind: { path: "$article", preserveNullAndEmptyArrays: true } }, // 按article子项的addedAt降序排序,升序将-1改为1即可 { $sort: { "article.addedAt": -1 } }, // 重新拼接回article数组 { $group: { _id: "$_id", user: { $first: "$user" }, article: { $push: "$article" }, vlogs: { $first: "$vlogs" } }}, // 同上处理vlogs数组 { $unwind: { path: "$vlogs", preserveNullAndEmptyArrays: true } }, { $sort: { "vlogs.addedAt": -1 } }, { $group: { _id: "$_id", user: { $first: "$user" }, article: { $first: "$article" }, vlogs: { $push: "$vlogs" } }} ]) // 聚合完成后执行populate填充关联的documentId字段 .populate("article.documentId vlogs.documentId")
方案2:应用层排序(适合数组元素量小的场景,代码更简洁)
查询到偏好文档后,直接在Node.js层对数组做原地排序即可:
const Preference = require('./你的Preference模型路径') const preference = await Preference.findOne({ user: 当前登录用户ID }) .populate("article.documentId vlogs.documentId") .lean() // 转为普通JS对象,提升操作性能 // 排序article数组,降序排列最新添加的在前 preference.article.sort((a, b) => { // addedAt为Date类型直接相减,为ISO字符串的话包裹new Date()转换 return b.addedAt - a.addedAt }) // 排序vlogs数组 preference.vlogs.sort((a, b) => b.addedAt - a.addedAt)
内容的提问来源于stack exchange,提问作者samman adhikari
相关产品推荐
相关产品推荐

