如何通过Mongoose投影仅获取嵌套字段的属性值?
Mongoose嵌套字段投影获取单个值的解决方案
当前你用select投影后得到的是嵌套对象结构,要直接拿到social_account这个字符串值,试试下面几种方法:
方法一:查询后直接提取属性
findOne返回的Mongoose文档对象支持链式访问,直接取嵌套字段即可:
const user = await User.findOne({email: enteredEmail}).select({_id:0, 'accountType.type':1}); const type = user?.accountType?.type; console.log(type); // 输出 'social_account'
如果想转成普通JS对象操作,加上.lean():
const user = await User.findOne({email: enteredEmail}).select({_id:0, 'accountType.type':1}).lean(); const type = user?.accountType?.type;
方法二:用聚合管道直接提取值
通过聚合的$project重命名字段,再用$replaceRoot直接返回单个值:
const type = await User.aggregate([ { $match: { email: enteredEmail } }, { $project: { _id: 0, type: '$accountType.type' } }, { $replaceRoot: { newRoot: '$type' } } ]).then(res => res[0]); console.log(type); // 输出 'social_account'
也可以简化成聚合后取结果里的字段:
const aggResult = await User.aggregate([ { $match: { email: enteredEmail } }, { $project: { _id: 0, type: '$accountType.type' } } ]); const type = aggResult[0]?.type;
方法三:解构赋值直接获取
结合.lean()转普通对象后,用解构赋值一步拿到字段:
const { accountType: { type } } = await User.findOne({email: enteredEmail}) .select({_id:0, 'accountType.type':1}) .lean() || {}; console.log(type);
内容的提问来源于stack exchange,提问作者D. Rattansingh
相关产品推荐
相关产品推荐

