如何返回Mongoose嵌套对象数组?GraphQL查询嵌套字段为null如何解决
问题排查与修复方案
核心问题1:GraphQL typeDef 结构定义错误
你当前的Message类型直接把transcript、recipient、sender定义为根字段,但实际在Mongoose模型中,这三个字段是嵌套在messageLog数组的每个子元素内的,结构完全不匹配,导致GraphQL解析器找不到对应字段值,返回null。
修复后的typeDef定义:
# 先定义messageLog数组的子元素类型 type MessageLogItem { transcript: String recipient: User sender: User } type Message { _id: ID # 正确关联嵌套的messageLog数组 messageLog: [MessageLogItem] }
核心问题2:关联字段未执行populate
你的Mongoose模型中sender和recipient是关联User模型的ObjectId字段,直接查询返回的只有ID字符串,需要调用populate方法填充关联的User实体数据,才能返回完整的User对象。
核心问题3:findOneAndUpdate参数顺序错误
你当前代码把$setOnInsert更新操作符放到了第三个参数(选项参数)的位置,属于语法错误,更新操作符必须统一放在第二个参数对象中。
完整修复后的resolver代码
const query = args.messageId ? { _id: args.messageId } : { _id: new ObjectId() }; // 修正更新参数结构,$setOnInsert放在第二个参数里 const message = await Message.findOneAndUpdate( query, { $addToSet: { messageLog: { transcript: args.messageBody, sender: args.senderId, recipient: args.recipientId } }, $setOnInsert: args }, { upsert: true, new: true, runValidators: true } // 填充sender和recipient的关联User数据 ).populate("messageLog.sender messageLog.recipient"); // 若resolver对应返回的是Message类型,直接返回message即可;若要返回messageLog数组,就返回message.messageLog return message;
内容的提问来源于stack exchange,提问作者dpat0074
相关产品推荐
相关产品推荐

