MongoDB聚合返回_id但GraphQL映射的id字段为null问题求助
你遇到的问题是$project阶段的字段配置错误,叠加GraphQL的默认字段解析规则导致的:
- MongoDB的文档默认主键字段为
_id,你的集合中并没有存储名为id的字段,所以你在$project中指定id:1时,聚合返回的结果里只会有name字段,id字段为不存在的undefined值 - GraphQL的字段解析默认规则是:如果父对象上已经存在和当前字段名完全一致的属性,会直接返回该属性值,不会触发你写的自定义resolve函数。所以你配置的
id字段resolve逻辑完全没有执行,console.log自然不会打印,最终返回给前端的就是null值
解决方法(二选一即可)
方法1:修改$project配置,保留_id字段触发resolve逻辑
把聚合的最后一个$project阶段改成:
{ $project: { _id: 1, name: 1, }, }
这样聚合返回的结果会携带_id和name字段,GraphQL找不到父对象上的id属性,就会触发你写的resolve函数,把_id转为id返回。如果返回的id是[object Object]格式,在resolve里加个toString即可:
return parentValue._id.toString()
方法2:直接在聚合阶段完成字段映射,不需要额外写resolve
直接在$project阶段把_id赋值给id字段,一步到位:
{ $project: { _id: 0, // 不需要返回_id的话可以设为0隐藏 id: "$_id", name: 1, }, }
这种方案返回的结果里已经存在id字段,GraphQL直接读取返回即可,不需要自定义resolve逻辑。
内容的提问来源于stack exchange,提问作者notElonMusk
相关产品推荐
相关产品推荐

