如何在MongoDB不使用aggregate的find查询中提取数组首末元素
方案1:MongoDB 4.4+ 版本直接在find投影中实现(推荐)
MongoDB 4.4及以上版本支持在find查询的投影参数中使用聚合表达式,不需要调用aggregate管道,完全兼容你现有的find、limit封装逻辑,写法如下:
// 第二个参数为投影配置,和原有字段选择逻辑可以无缝融合 YourModel.find( { /* 你原有的过滤条件 */ }, { // 其他需要返回的字段正常配置即可 firstMsg: { $first: "$messages" }, // 取messages数组第一个元素 lastMsg: { $last: "$messages" }, // 取messages数组最后一个元素 messages: 0 // 可选配置,如果不需要返回完整的messages数组可以加这行隐藏 } ) .limit(/* 你原有的分页参数 */)
方案2:低版本MongoDB用Mongoose虚拟字段兼容
如果你使用的MongoDB版本低于4.4,不需要修改现有查询封装代码,只需要在对应Schema中添加两个虚拟字段即可:
const yourSchema = new mongoose.Schema({ messages: Array, // 其他原有字段定义 }, { toJSON: { virtuals: true }, // 序列化JSON时返回虚拟字段 toObject: { virtuals: true } // 转普通对象时返回虚拟字段 }) // 定义第一个元素虚拟字段 yourSchema.virtual('firstMsg').get(function () { return this.messages?.[0] ?? null }) // 定义最后一个元素虚拟字段 yourSchema.virtual('lastMsg').get(function () { const len = this.messages?.length return len ? this.messages[len - 1] : null })
配置完成后,你原有的find查询逻辑不需要做任何修改,查询返回的文档会自动携带firstMsg和lastMsg两个字段,包含数组首尾元素。
内容的提问来源于stack exchange,提问作者Chique
相关产品推荐
相关产品推荐

