Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js GraphQL和Mongoose将属性覆盖为null,并在变异中使用未传递的参数_Node.js_Mongodb_Express_Mongoose_Graphql - Fatal编程技术网

Node.js GraphQL和Mongoose将属性覆盖为null,并在变异中使用未传递的参数

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

我已经尽可能地简化了这个例子,所以如果需要任何额外的信息,我可以提供它。假设我们有一个带有嵌入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”}
property
last
传递任何突变时,总是使用
null
值获取覆盖。如果我需要更改姓氏,我必须传递以前的名字和新的姓氏。我想有一个可能性,以更新只有一个第一或最后不影响另一个。我如何才能找到它?

这是因为Mongoose update属性将嵌套对象作为一个整体进行修改。所以,如果我们需要在更新操作中进行深度合并,我们需要一些东西


如果我们需要覆盖更多的嵌套层,我们可以在while循环中使用此代码。

我知道JavaScript中的原因。它不支持深度克隆或深度合并,所以我仍在寻找解决方案。