Mongodb 解决Mongoose和GraphQL中的关系

Mongodb 解决Mongoose和GraphQL中的关系,mongodb,mongoose,graphql,apollo-server,Mongodb,Mongoose,Graphql,Apollo Server,所以,我有一个我正在启动的应用程序,我将使用Apollo使用MERNG stack 我通过阅读博客文章和观看视频来进行研究,以便更好地了解GraphQL是如何工作的,但实际上从未使用过它。在某个时候,我开始看到db模型之间关系的示例,例如来自用户的帖子 例如: import { model, Schema } from 'mongoose'; const postSchema = new Schema( { title: String, cr

所以,我有一个我正在启动的应用程序,我将使用Apollo使用MERNG stack

我通过阅读博客文章和观看视频来进行研究,以便更好地了解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);

我想知道在进行查询以检索帖子中的用户数据时,哪种方法是填充相关字段的最佳方法

正如我看到的,有两种选择:

1-使用猫鼬附带的填充。这样做的缺点是,即使我没有在GraphQL查询中请求字段,它也将始终填充该字段。 2-使用一个函数,该函数将使用findById检索相关对象,然后手动分配它。这不存在填充的问题,因为它只在需要字段时才会得到它,相反,它增加了我必须查询数据库的次数


我了解利弊,但我不确定哪一个是最好的解决方案。还有其他我没有的选项吗?

您的第二个选项对数据库不好,因为如果您从数据库中获得数百万条记录,那么当您调用特定字段时,另一个数百万条点击会自动工作

你的第一个选择也不符合你的期望。因为您是否需要特定的字段,它会自动调用

所以我希望这对你来说是更好的解决方案。您可以从客户端获取字段要求的内容,您可以使用自定义装饰器来获取这些字段。然后,您应该使用聚合来获取所需的内容。然后根据字段just use if条件决定是否调用$lookup

注意:Resolve属性不应命中数据库,因为原因是您已经知道

我希望它能帮助你

    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);