You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:24:00