在 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 从填充模型有条件地返回值的最有效方法?

NestJS + Mongoose + GraphQL:“填充”不起作用

GraphQL、Relay 和 Mongodb (mongoose) 如何获取数组