如何过滤嵌套数组对象?Mongoose查询后过滤失效解决
问题解决方法
核心原因
- Mongoose文档与普通JS对象的差异:
find()默认返回Mongoose Document实例,嵌套的images是MongooseArray对象,虽支持filter方法,但属性访问、类型判断逻辑和原生JS数组存在差异,导致过滤失效。 - 代码变量错误:原代码中
result变量未定义,逻辑判断完全无效,还可能触发报错。
具体解决方案
方案一:用lean()获取纯JS对象
查询时添加lean(),让Mongoose直接返回原生JavaScript对象,后续处理逻辑和静态数据完全一致:
exports.getImages = async (req,res) => { try { const myArrayData = await ImageModel.find().lean().exec(); if(!myArrayData.length) { return res.status(400).json({ data: null }); } const newResult = myArrayData.map(data => { return { user: data.user, images: data.images.filter(item => item.size >= 20) } }) res.json(newResult); } catch(err) { return res.status(500).json({ err: err.message }); } }
方案二:将文档转为普通对象(不使用lean)
若需保留Mongoose文档方法,可通过toObject()把每个文档转成普通JS对象:
exports.getImages = async (req,res) => { try { const myArrayData = await ImageModel.find().exec(); if(!myArrayData.length) { return res.status(400).json({ data: null }); } const newResult = myArrayData.map(doc => { const data = doc.toObject(); return { user: data.user, images: data.images.filter(item => item.size >= 20) } }) res.json(newResult); } catch(err) { return res.status(500).json({ err: err.message }); } }
进阶优化:数据库端直接过滤
数据量较大时,建议在数据库层面完成过滤,减少服务端内存消耗,使用$filter聚合操作:
exports.getImages = async (req,res) => { try { const newResult = await ImageModel.aggregate([ { $addFields: { images: { $filter: { input: "$images", as: "item", cond: { $gte: ["$$item.size", 20] } } } } } ]).exec(); res.json(newResult); } catch(err) { return res.status(500).json({ err: err.message }); } }
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

