mongoose findByIdAndUpdate对graphql

时间:2018-05-24 15:34:58

标签: node.js mongoose graphql

尝试使用graphql.findByIdAndUpdate更新mongoose架构时遇到问题。

每当我尝试更新文档时,新数据都会正确更新,但未经修改的数据会变为空。

所以,如果我在graphiql中运行它:

mutation {
  updateProfile(id: "5b05b4cfd53486377061eab3", name: "dave") {
    id
    name
    age
    interests
  }
}

它返回此对象:

{
  "data": {
    "updateProfile": {
      "id": "5b05b4cfd53486377061eab3",
      "name": "dave",
      "age": null,
      "interests": null
    }
  }
}

新数据已更新为文档,但旧数据已被删除。

这个想法是只能更新文档的单个部分而不会将其余部分变为空。

负责更新的GraphQL代码:

updateProfile: {
            type: profileType,
            args: {
                id:        { type: new GraphQLNonNull(GraphQLID) },
                name:      { type: GraphQLString },
                age:       { type: GraphQLString },
                interests: { type: GraphQLString },
            },
            resolve(parent, args) {
                return Profile.findByIdAndUpdate(args.id, {
                        name:      args.name,
                        age:       args.age,
                        interests: args.interests
                }, {new: true}, (err, Profile) => {
                    if (err) {
                        return res.status(500).send(err);
                    }
                    return;
                }); 
            }
        }

这是架构:

const profileSchema = mongoose.Schema({
    name:      String,
    age:       String,
    interests: String,
});

提前感谢任何和所有帮助!

1 个答案:

答案 0 :(得分:-1)

这可以像下面的示例一样解决。

以前,您是分别通过args参数的值来设置或更新字段的。

您需要像下面的代码一样直接在“ findByIdAndUpdate(args.id,args)”中传递args参数

它将仅更新请求中的字段。

在突变中:

   updateProfile: {
        type: profileType,
        args: {
            id:        { type: new GraphQLNonNull(GraphQLID) },
            name:      { type: GraphQLString },
            age:       { type: GraphQLString },
            interests: { type: GraphQLString },
        },
        resolve(parent, args) {
            return Profile.findByIdAndUpdate(args.id,args, (err, Profile)=> {
                 if(err) {
                     return res.status(500).send(err);
                 }
                 return
            }) 
        }
    }

我希望这对其他人有用,谢谢。