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

如何在MongoDB中部分更新对象,使新对象与现有对象重叠/合并

居京
2023-03-14
{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2",
        param3 : "val3"
   }
}
var new_info = {
    param2 : "val2_new",
    param3 : "val3_new"
};

我想在对象的现有状态上合并/覆盖新字段,这样param1就不会被删除

这样做

db.collection.update(  { _id:...} , { $set: { some_key : new_info  } } 

将导致MongoDB完全按照要求执行,并将some_key设置为该值。替换旧的。

{
   _id : ...,
   some_key: { 
      param2 : "val2_new",
      param3 : "val3_new"
   }
}
{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2_new",
        param3 : "val3_new"
   }
}

我正在使用Java客户机,但任何示例都将受到赞赏

共有1个答案

汤修贤
2023-03-14

如果我正确理解了问题,您希望用另一个文档的内容更新一个文档,但只更新不存在的字段,而完全忽略已经设置的字段(即使设置为另一个值)。

在一个命令中无法做到这一点。

您必须首先查询文档,找出您想要$set的内容,然后更新它(使用旧值作为匹配筛选器,以确保在这两者之间没有并发更新)。

对您的问题的另一种解读是,您对$set很满意,但不想显式设置所有字段。那么你会如何传递数据呢?

您知道您可以执行以下操作:

db.collection.update(  { _id:...} , { $set: someObjectWithNewData } 
 类似资料:
  • 我已经搜索和尝试了许多答案,但我似乎无法让这个工作。我在MongoDB中有一个用户(db.users...)我试图在一个特定的文档中更新一个名为“角色”的字段。如果我执行: assert失败:需要对象错误:在printStackTrace(src/mongo/shell/utils.js:37:15)在doassert(src/mongo/shell/assert.js:6:5)在assert(s

  • 我正在使用java和MongoDB的mongo-Jackson包装器。我通过查询我的一个字段(不是_id字段)找到一个对象,然后我需要知道_id字段值,净结果是更新还是插入。但是,我得到了一个异常: 异常来自包装器,而不是MongoDB驱动程序本身。 做这件事的正确方法是什么(如果有的话)?

  • 互联网上充斥着处理数组的资源,但对象通常更适合数据,而且似乎更高效。 我想在动态字段名下存储键值对象,如下所示: 这样做似乎比保留一个包含所有语言的数组并对其进行过滤以获取给定语言的所有语言条目更有效。 我的问题是:如何使用猫鼬将键值对插入到具有动态名称的对象中?对象是否需要存在,或者如果在一个操作中不存在,我可以创建它吗? 我试过这个: 但不管我是否有一个空对象开始,都没有运气:。 奖励:我应该

  • 我想检查一个对象是否有新的子对象。我的意思是我有一个带有x嵌套对象的对象,但是如果主对象有新对象,我会检查它。有什么现有的解决方案来检查这个问题吗? 我的目标是如果对象有新项目,则调用函数。每次数组更改时,此代码都会调用该函数。也当一些项目被删除。这部分功能是错误的。有办法修好它吗?

  • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。

  • 我正在与AngularJS项目工作,我有以下问题。我有个密码: form.html: 使用这段代码,someVariable不会显示,但当我将ng-model更改为someVariable.SomeField时,我试图显示它...管用!有人能解释一下为什么吗?