在 Mongoose 和 GraphQL 中解决关系
Posted
技术标签:
【中文标题】在 Mongoose 和 GraphQL 中解决关系【英文标题】:Solving relationships in Mongoose and GraphQL 【发布时间】:2020-04-16 09:04:31 【问题描述】:所以,我有一个正在启动的应用程序,我将使用 Apollo 使用 MERNG 堆栈。
我通过阅读博客文章和观看视频进行研究,以便更好地了解 GraphQL 的工作原理(从未真正使用过它)。在某个时候,我开始看到 db 模型之间的关系示例,例如“来自用户的帖子”。
例如:
import model, Schema from 'mongoose';
const postSchema = new Schema(
title: String,
createdBy
type: Schema.Types.ObjectId,
ref: 'User',
;
export default model('Post', postSchema);
import model, Schema from 'mongoose';
const userSchema = new Schema(
email: String,
password: String,
posts [
type: Schema.Types.ObjectId,
ref: 'Post',
]
export default model('User', userSchema);
我想知道在进行查询以检索帖子中的用户数据时,哪种方法是“填充”相关字段的最佳方法。
我看到有两种选择:
1 - 使用 Mongoose 自带的填充。这样做的缺点是,即使我没有在 GraphQL 查询中要求它,它也会始终填充该字段。 2 - 使用将使用 findById 检索相关对象然后手动分配它的函数。这不存在填充问题,因为它只会在需要该字段时获取它,而是增加了我必须查询数据库的次数。
我了解利弊,但我不确定哪个是最好的解决方案。我还有其他选择吗?
【问题讨论】:
【参考方案1】:您的第二个选项不适用于数据库,因为如果您从数据库中获取数百万条记录,那么当您调用特定字段时,另外数百万条命中会自动起作用。
您的第一个选项也不符合您的期望。因为你想要特定的字段或不自动调用它。
所以我希望它对你来说是更好的解决方案。您可以从客户端获取字段要求的内容(您可以使用自定义装饰器来获取这些字段)。然后你应该使用聚合来得到你想要的。然后你决定 $lookup
是否在你的字段的帮助下调用(只使用 if 条件)。
注意:解析属性不应访问您的数据库,因为您已经知道原因。
希望对你有帮助
【讨论】:
以上是关于在 Mongoose 和 GraphQL 中解决关系的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose + GraphQL 无法填充模型 [重复]
嵌套的 Mongoose 查询数据未显示在 GraphQL 查询中
如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用
使用 Mongoose 和 GraphQL 从填充模型有条件地返回值的最有效方法?