如何使用GraphQL args

时间:2018-01-28 23:56:31

标签: node.js mongodb mongoose graphql

我不完全理解MongoDB关系的工作方式,但我相信艺术家的关系专辑是艺术家(我称之为用户)有一个相册ID列表数组,可能称为albums: [],所有相册都有createdBy: {id: 12345}

所以我想创建一个updateAlbum调用,但我不知道如何从GraphQL将ID保存到createdBy:

这是架构:

var AlbumSchema = new Schema({
    name: String,
    dateCreated: { type: Date, default: Date.now },
    dateUpdated: { type: Date, default: Date.now },
    users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    createdBy: { type: Schema.Types.ObjectId, ref: 'User'}
});
var UserSchema = new Schema({
    fName: String,
    lName: String,
    albums: [{ type: Schema.Types.ObjectId, ref: 'Album'}]
});

以下是GraphQL类型:

const UserType = new GraphQLObjectType({
    name: 'User',
    fields: () => ({
        id: {type: GraphQLID},
        fName: {type: GraphQLString},
        lName: {type: GraphQLString},
        albums: {type: new GraphQLList(AlbumType)}
    })
})
const AlbumType = new GraphQLObjectType({
    name: 'Album',
    fields: () => ({
        id: {type:GraphQLID},
        name: {type:GraphQLString},
        dateCreated: {type: GraphQLString},
        dateUpdated: {type: GraphQLString},
        users: {type: new GraphQLList(UserType)},
        createdBy: {type: UserType}
    })
})

这是updateAlbum调用:

updateAlbum: {
            type: AlbumType,
            args: {
                id: {type: new GraphQLNonNull(GraphQLString)},
                name: {type: GraphQLString},
                createdById: {type: GraphQLString}
            },
            resolve(parentValue, args){
                return new Promise((resolve, reject) => {
                    console.log(args.createdById)
                    const date = Date().toString()
                    ALBUM.findOneAndUpdate(
                        {"_id": args.id},
                        { "$set":{name: args.name,
                                dateUpdated: date,
                                createdBy: args.createdById}},
                        {"new": true} //returns new document
                    ).exec((err, res) => {
                        if(err) reject(err)
                        else resolve(res)
                    })
                })
            }
        }

如何在updateAlbum函数中保存关系?

这是我得到的 - 如果我保存createdBy: THE_ID_STRING它没有正确地执行它,当我查询时,我得到一个奇怪的未知字符串“Zj \b \u001e ( “ID字符串console.log()为”5a6ac1afac97c908dc1edf28“

1 个答案:

答案 0 :(得分:1)

根据您的Mongo Schema定义,我会说您对引用的理解是正确的,看看您使用Schema.Types.ObjectId正确使用文档引用的方式。

现在,您只需将GraphQLID映射为createdBy的GraphQL 类型
我喜欢使用别名,因为MongoId有两个原因。

1)所以我明确地只知道GraphQL类型定义,如果我忘记了我分配给它的数据类型,那么无需回到Mongo Schema会发生什么行为:{{ 1}} || Schema.Types.ObjectId

2)最重要的是,要在视觉上强调标准String类型与String类型之间的重要区别,因为Mongo使用Object作为文档索引Object.prototype即使他们看起来像是来自_id

如:

String.prototype

顺便说一句,您应该验证import { GraphQLList, GraphQLID as MongoId, GraphQLString as StringType, GraphQLObjectType as ObjectType, } from 'graphql'; const AlbumType = new ObjectType({ name: 'Album', fields: () => ({ id: { type: MongoId }, name: { type: StringType }, dateCreated: { type: StringType }, dateUpdated: {type: StringType }, users: { type: new GraphQLList(UserType)}, createdBy: { type: MongoId} }) }) 不应该是id

如果您需要进一步说明,可以参考我刚刚完成的涉及此问题的项目。 GraphQL类型为here