首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何部分更新MongoDB中的对象,使新对象与现有对象重叠/合并

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

Stack Overflow用户
提问于 2012-04-24 09:33:02
回答 14查看 238.6K关注 0票数 229

假设本文档保存在MongoDB中

代码语言:javascript
运行
复制
{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2",
        param3 : "val3"
   }
}

需要保存包含来自外部世界的有关param2param3的新信息的对象

代码语言:javascript
运行
复制
var new_info = {
    param2 : "val2_new",
    param3 : "val3_new"
};

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

这样做

代码语言:javascript
运行
复制
db.collection.update(  { _id:...} , { $set: { some_key : new_info  } } 

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

代码语言:javascript
运行
复制
{
   _id : ...,
   some_key: { 
      param2 : "val2_new",
      param3 : "val3_new"
   }
}

让MongoDB只更新新字段(不逐个明确说明)的方法是什么?要获得以下信息:

代码语言:javascript
运行
复制
{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2_new",
        param3 : "val3_new"
   }
}

我使用的是Java客户端,但任何示例都将不胜感激

EN

回答 14

Stack Overflow用户

发布于 2015-11-15 01:33:13

您可以使用点符号来访问和设置对象内部的字段,而不会影响这些对象的其他属性。

给定您在上面指定的对象:

代码语言:javascript
运行
复制
> db.test.insert({"id": "test_object", "some_key": {"param1": "val1", "param2": "val2", "param3": "val3"}})
WriteResult({ "nInserted" : 1 })

我们只能更新some_key.param2some_key.param3

代码语言:javascript
运行
复制
> db.test.findAndModify({
... query: {"id": "test_object"},
... update: {"$set": {"some_key.param2": "val2_new", "some_key.param3": "val3_new"}},
... new: true
... })
{
    "_id" : ObjectId("56476e04e5f19d86ece5b81d"),
    "id" : "test_object",
    "some_key" : {
        "param1" : "val1",
        "param2" : "val2_new",
        "param3" : "val3_new"
    }
}

你可以像你喜欢的那样深入研究。这对于在不影响现有属性的情况下向对象添加新属性也很有用。

票数 27
EN

Stack Overflow用户

发布于 2016-09-07 04:43:02

最好的解决方案是从对象中提取属性,并使其成为扁平点标记键值对。例如,您可以使用以下库:

https://www.npmjs.com/package/mongo-dot-notation

它具有.flatten功能,允许您将对象更改为平面属性集,然后将这些属性提供给$set修饰符,而无需担心现有DB对象的任何属性将在不需要的情况下被删除/覆盖。

摘自mongo-dot-notation文档:

代码语言:javascript
运行
复制
var person = {
  firstName: 'John',
  lastName: 'Doe',
  address: {
    city: 'NY',
    street: 'Eighth Avenu',
    number: 123
  }
};



var instructions = dot.flatten(person)
console.log(instructions);
/* 
{
  $set: {
    'firstName': 'John',
    'lastName': 'Doe',
    'address.city': 'NY',
    'address.street': 'Eighth Avenu',
    'address.number': 123
  }
}
*/

然后它会形成完美的选择器--它只会更新给定的属性。编辑:我有时喜欢做考古学家;)

票数 23
EN

Stack Overflow用户

发布于 2012-04-24 09:40:13

Mongo允许您使用.约定更新嵌套文档。看一下:Updating nested documents in mongodb。这是过去关于合并更新的另一个问题,就像您正在寻找的那个I believe:MongoDB atomic update via 'merge' document

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10290621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档