Node.js GraphQL和Mongoose将属性覆盖为null,并在变异中使用未传递的参数
我已经尽可能地简化了这个例子,所以如果需要任何额外的信息,我可以提供它。假设我们有一个带有嵌入GraphQLObjectType的简易模式:Node.js GraphQL和Mongoose将属性覆盖为null,并在变异中使用未传递的参数,node.js,mongodb,express,mongoose,graphql,Node.js,Mongodb,Express,Mongoose,Graphql,我已经尽可能地简化了这个例子,所以如果需要任何额外的信息,我可以提供它。假设我们有一个带有嵌入GraphQLObjectType的简易模式: const nameType = new GraphQLObjectType({ name: 'NameType', fields: { first: new GraphQLNonNull(GraphQLString), last: GraphQLString, }, }); const userType = new Grap
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”}
propertylast
传递任何突变时,总是使用null
值获取覆盖。如果我需要更改姓氏,我必须传递以前的名字和新的姓氏。我想有一个可能性,以更新只有一个第一或最后不影响另一个。我如何才能找到它?这是因为Mongoose update属性将嵌套对象作为一个整体进行修改。所以,如果我们需要在更新操作中进行深度合并,我们需要一些东西
如果我们需要覆盖更多的嵌套层,我们可以在while循环中使用此代码。我知道JavaScript中的原因。它不支持深度克隆或深度合并,所以我仍在寻找解决方案。