如何进行更新突变 - GraphQL(加上 mongoDB)

Posted

技术标签:

【中文标题】如何进行更新突变 - GraphQL(加上 mongoDB)【英文标题】:How to make Update Mutation - GraphQL (plus mongoDB) 【发布时间】:2018-07-04 07:37:54 【问题描述】:

我想对专辑进行更新突变,但在获取更新和获取返回值时遇到问题。

模式猫鼬:

var AlbumSchema = new Schema(
    name: String,
    dateCreated:  type: Date, default: Date.now ,
    dateUpdated:  type: Date, default: Date.now 
);

GraphQL 类型:

    const AlbumType = new GraphQLObjectType(
        name: 'Album',
        fields: () => (
            id: type:GraphQLID,
            name: type:GraphQLString,
            dateCreated: type: GraphQLString,
            dateUpdated: type: GraphQLString
        )
    )

更新突变:

updateAlbum:  //STILL TRYING TO GET TO WORK
            type: AlbumType,
            args: 
                id: type: new GraphQLNonNull(GraphQLString),
                name: type: new GraphQLNonNull(GraphQLString)
            ,
            resolve(parentValue, args)
                return new Promise((resolve, reject) => 
                    ALBUM.findOneAndUpdate(
                        id: args.id,
                        name: args.name,
                        //dateUpdated:  Date.now()
                    ).exec((err, res) => 
                        if(err) reject(err)
                        else resolve()
                    )
                )
            
        

测试突变:

mutation 
  updateAlbum(id:"5a695c586c050802f182270c", name: "album 333")
    id
   name 

测试突变的反应:


  "data": 
    "updateAlbum": null
  

问题:

    updateAlbum函数应该怎么写?

    (不太重要)如何添加Date.now() 以获得新的dateUpdated: 值?

    我如何获得返回值,或者我可以获得不是updateAlbum: null 的响应是什么?谢谢!

【问题讨论】:

【参考方案1】:
    见下文。您需要添加“$set”来放置您将要更改的参数集。
    updateAlbum: 
                type: AlbumType,
                args: 
                    id: type: new GraphQLNonNull(GraphQLString),
                    name: type: new GraphQLNonNull(GraphQLString)
                ,
                resolve(parentValue, args)
                    return new Promise((resolve, reject) => 
                        const date = Date().toString()
                        ALBUM.findOneAndUpdate(
                            "_id": args.id,
                             "$set":name: args.name, dateUpdated: date,
                            "new": true //returns new document
                        ).exec((err, res) => 
                            console.log('test', res)
                            if(err) reject(err)
                            else resolve(res)
                        )
                    )
                
            
    日期需要做成一个字符串,用 Date() 代替 Date.now() 保持与猫鼬格式相同。 见上图,需要将res加入resolve()

【讨论】:

以上是关于如何进行更新突变 - GraphQL(加上 mongoDB)的主要内容,如果未能解决你的问题,请参考以下文章

应该如何对列表中的项目进行重新排序,并更新多个对象,如何使用 GraphQL 突变进行持久化?

如何在 GraphQL 中执行突变?

FaunaDB - 如何批量更新单个 graphQL 突变中的条目列表?

如何在没有参数的情况下进行graphql突变? (Vue 阿波罗)

Sequelize with GraphQl:如何使用突变更新字段

如何在 Apollo / GraphQL 发生突变后更新缓存?