当前位置: 首页 > 知识库问答 >
问题:

如何仅为提供的键更新mongoose文档的嵌套对象

万铭
2023-03-14

我将根据提供的键更新mongoose文档的一些字段。例如,当我们在JSON中呈现mongoose文档时。

user: {
  address: {
    city: "city"
    country: "country"
  }
}

和更新参数,如下所示。

address: {
   city: "city_new"
}

当我这样运行mongoose api时。

let params = {
   address: {
      city: "city_new"
   }
}
User.set(param)

它替换了整个地址对象,最终结果是

user: {
  address: {
    city: "city_new"
  }
}

它只是替换地址字段,但我想只更新城市字段。这是理想的结果。

user: {
  address: {
    city: "city_new"
    country: "country"
  }
}

谢谢

共有1个答案

蒯胜泫
2023-03-14

当嵌套对象具有更复杂的层次结构时,我们如何解决这一问题,而不手动指示像Address.city.Field1.Field2这样的字段。

正如大多数答案所暗示的,您必须使用点表示法来更新嵌入的文档,并且为了回答您的上述问题,使用以下helper方法,该方法应用递归将给定对象转换为其点表示法:

function convertToDotNotation(obj, newObj={}, prefix="") {

  for(let key in obj) {
      if (typeof obj[key] === "object") {
          convertToDotNotation(obj[key], newObj, prefix + key + ".");
      } else {
          newObj[prefix + key] = obj[key];
      }
  }

  return newObj;
}


let params = {
   address: {
      city: {
         location: {
            street: "new street"
         }
      }  
   }
};

const dotNotated = convertToDotNotation(params);
console.log(JSON.stringify(dotNotated, null, 4));
 类似资料:
  • 假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

  • 我正在尝试更新MongoDB中嵌套对象中的一个键值。目前,我的做法是覆盖整个嵌套对象,我如何改变一个键-值对?

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 将mongodb与pymongo一起使用,我有以下文档: 我想更新示例子文档(这是一个数组元素,因为可能有多个示例)。我有以下代码,但它不工作... 谁能告诉我这个有什么问题吗?

  • 我有一个mongodb集合的mongoose模式,我将其定义如下: 在数据库集合中,我当前有一个文档,它包含除以外的所有属性的值,用于测试目的。我有一个服务器endpoint,当被调用时,它应该发出一个PUT请求来更新文档并向sketches数组中添加一个对象: 在这个web服务中,我基本上试图通过用户名选择用户文档,用户名作为参数传递给url字符串,如下所示: 由于某种原因,当我尝试使用具有以下

  • 我有一个模型看起来是这样的: 我正在使用存储库模式,下面是我的代码片段: 这实际上会引发以下错误: 我目前的做法 当前对我有效的是在更新嵌套对象时使用。然而,这提出了几点考虑: 需要额外的代码来获取整个文档、解析和更新必需的字段 由于在文档级别上工作,因此它还将更新文档中未更改的部分,这并不理想。