mongodb - 如何部分更新 MongoDB 中的对象,以便新对象与现有对象重叠/合并

鉴于此文档保存在 MongoDB 中

{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2",
        param3 : "val3"
   }
}

需要保存一个带有来自外界的param2param3新信息的对象

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"
   }
}

让 MongoDB 只更新新字段的方法是什么(没有明确地一一说明)?得到这个:

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

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

最佳答案

我用自己的函数解决了这个问题。如果您想更新文档中的指定字段,您需要清楚地解决它。

例子:

{
    _id : ...,
    some_key: { 
        param1 : "val1",
        param2 : "val2",
        param3 : "val3"
    }
}

如果你只想更新param2,这样做是错误的:

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

你必须使用:

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

所以我写了一个类似的函数:

function _update($id, $data, $options=array()){

    $temp = array();
    foreach($data as $key => $value)
    {
        $temp["some_key.".$key] = $value;
    } 

    $collection->update(
        array('_id' => $id),
        array('$set' => $temp)
    );

}

_update('1', array('param2' => 'some data'));

https://stackoverflow.com/questions/10290621/

相关文章:

mongodb - 如何更改字段的类型?

node.js - 将 created_at 和 updated_at 字段添加到 Mongoose

python - 如何使用 pymongo 对 mongodb 进行排序

mongodb - 如何检查数组字段是否包含唯一值或 MongoDB 中的另一个数组?

windows - 可视化管理 MongoDB 文档和集合

sql - NoSQL 的用例

mongodb - Node.js Mongoose.js 字符串到 ObjectId 函数

mongodb - NoSQL - MongoDB 与 CouchDB

mongodb - 无法连接到服务器 127.0.0.1 :27017

mongodb - 我怎么知道 mongoDB 在哪里存储数据? (它不在 default/data