MongoDB Realm GraphQL:如何在自定义解析器中返回多类型自定义负载
解决MongoDB Realm GraphQL自定义解析器返回多类型混合结构的问题
我完全理解你遇到的困境——MongoDB Realm的自定义解析器默认在定义返回负载时确实限制较多,没法直接引用已有的集合类型来构建混合结构,但通过**自定义类型(Custom Type)**的方式,完全可以实现你需要的两种场景:
场景1:返回包含多集合数组的对象({shirts: [Shirts], trousers: [Trousers], shoes: [Shoes]})
这种情况的核心是先在Realm Schema中定义一个包装类型,把多个集合数组字段整合进去:
创建自定义类型
登录Realm控制台,进入你的应用的Schema页面,点击Add a Custom Type,命名为ClothingBundle(或者你喜欢的名称)。
给这个类型添加三个字段:shirts:类型选择Array,然后在Linked Type下拉菜单中选择你的Shirts集合类型trousers:同理,选择Array并关联到Trousers集合类型shoes:关联到Shoes集合类型
创建关联的自定义解析器
进入GraphQL->Custom Resolvers页面,点击Create Resolver:- 设置Resolver的名称(比如
getClothingBundle) - 返回类型选择你刚创建的
ClothingBundle - 在解析器函数中,分别查询三个集合的数据并组装成对应结构返回,示例代码(JavaScript):
exports = async function() { const db = context.services.get("mongodb-atlas").db("your-database-name"); // 并行查询三个集合的数据 const [shirts, trousers, shoes] = await Promise.all([ db.collection("Shirts").find().toArray(), db.collection("Trousers").find().toArray(), db.collection("Shoes").find().toArray() ]); return { shirts, trousers, shoes }; };
- 设置Resolver的名称(比如
场景2:返回混合标量与数组的对象({shirts: [Shirts], isFoo: Boolean})
思路和场景1一致,只是自定义类型包含标量字段:
创建自定义类型
新建一个自定义类型(比如ShirtsWithFlag),添加两个字段:shirts:Array类型,关联到Shirts集合isFoo:Boolean类型
编写解析器
创建对应Resolver,返回类型选择ShirtsWithFlag,函数中查询Shirts数据并添加布尔字段:exports = async function() { const db = context.services.get("mongodb-atlas").db("your-database-name"); const shirts = await db.collection("Shirts").find().toArray(); // 根据业务逻辑设置isFoo的值 const isFoo = true; return { shirts, isFoo }; };
额外提示
- 如果你需要更灵活的临时结构(不追求严格类型检查),也可以将解析器的返回类型设置为
JSON,这样可以返回任意结构,但会失去GraphQL的类型安全优势,不推荐在生产环境使用。 - 自定义类型创建后,Realm会自动将其加入GraphQL Schema中,你可以在
GraphQL页面的Schema标签中查看生成的类型定义,确保结构符合预期。
内容的提问来源于stack exchange,提问作者Pinkney
相关产品推荐
相关产品推荐

