我试图尽可能简化示例,因此如果需要任何其他信息,我可以提供它。假设我们有一个简单的模式嵌入了GraphQLObjectType:
const nameType = new GraphQLObjectType({
name: 'NameType',
fields: {
first: new GraphQLNonNull(GraphQLString),
last: GraphQLString,
},
});
const userType = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: new GraphQLNonNull(GraphQLID),
name: new GraphQLNonNull(nameType),
email: new GraphQLNonNull(GraphQLString),
}),
});
所以我在这里有属性的第一个和最后一个名称。为了更新,我写了如下突变。有 GraphQLInputObjectType 表示为 NameType。
const nameType = new GraphQLInputObjectType({
name: 'NameInput',
fields: {
first: new GraphQLNonNull(GraphQLString),
last: GraphQLString,
},
});
const updateUser = {
name: 'UpdateUser',
type: userType,
args: {
id: new GraphQLNonNull(GraphQLID),
name: nameType,
email: GraphQLString,
},
resolve: (_, args, context) => User.findOneAndUpdate({ _id: args.id }, args, { new: true })
};
因此,当我传递带有name: {first: "Foo"}
属性的任何突变时last
总是得到null
值的覆盖。如果我需要更改姓氏,我被迫传递以前的名字和新的姓氏。我希望有可能只更新一个第一个或最后一个,而不会影响另一个。我怎样才能联系到它?
这是因为 Mongoose 更新属性会整体修改嵌套对象。因此,如果我们需要在更新操作中深度合并,我们需要像这里这样的东西。
如果我们需要覆盖更多的嵌套层,我们可以在 while 循环中使用此代码。