【问题标题】:Loading relational data in GraphQL & MongoDB在 GraphQL 和 MongoDB 中加载关系数据
【发布时间】:2018-01-28 17:07:48
【问题描述】:

这是我的架构:

type User {
    _id: ID!
    username: String
    email: String!
    firstName: String
    lastName: String
    avatar: String
    createdAt: Date!
    updatedAt: Date!
}

type Tweet {
    _id: ID!
    text: String!
    user: User!
    favoriteCount: Int!
    createdAt: Date!
    updatedAt: Date!
}

这是我的Tweet 模型:

import mongoose, { Schema } from 'mongoose';

const TweetSchema = new Schema({
    text: {
        type: String,
        minLength: [5, 'Your tweet is too short.'],
        maxLength: [144, 'Your tweet is too long.']
    },
    user: {
        type: Schema.Types.ObjectId,
        ref: 'User'
    },
    favoriteCount: {
        type: Number,
        default: 0
    }
}, { timestamps: true });

export default mongoose.model('Tweet', TweetSchema);

上述 GraphQL 架构由 express 提供,如下所示:

import { graphqlExpress } from 'apollo-server-express';
import { makeExecutableSchema } from 'graphql-tools';

import typeDefs from '../graphql/schema';
import resolvers from '../graphql/resolvers';

const schema = makeExecutableSchema({
    typeDefs,
    resolvers
});

const app = express();
app.use(
    '/graphql', 
    graphqlExpress(req => ({ 
        schema
    }))
);

我使用下面的代码来模拟一些用户并使用这样的 faker 发推文:

https://pastebin.com/raw/kJ9m8KjR

当整个事情运行时,我可以看到 mongodb 填充了与这样的用户链接的虚拟推文:

但是当我通过 GraphiQL 查询时,用户信息没有通过:

有什么想法吗?

【问题讨论】:

标签: mongodb graphql


【解决方案1】:

你的解析器会得到这样的推文:

Tweet.find({}).sort({ createdAt: -1 });

如果您查看docs,您会注意到您需要告诉 mongoose 使用 populate 将 id 引用替换为实际文档:

Tweet.find({}).populate('user').sort({ createdAt: -1 });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-03
    • 2014-03-09
    • 2011-05-15
    • 2020-01-22
    • 2018-07-07
    • 2020-11-09
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多