假设本文档保存在MongoDB中
{
_id : ...,
some_key: {
param1 : "val1",
param2 : "val2",
param3 : "val3"
}
}
需要保存包含来自外部世界的有关param2
和param3
的新信息的对象
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客户端,但任何示例都将不胜感激
发布于 2015-11-15 01:33:13
您可以使用点符号来访问和设置对象内部的字段,而不会影响这些对象的其他属性。
给定您在上面指定的对象:
> db.test.insert({"id": "test_object", "some_key": {"param1": "val1", "param2": "val2", "param3": "val3"}})
WriteResult({ "nInserted" : 1 })
我们只能更新some_key.param2
和some_key.param3
> 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"
}
}
你可以像你喜欢的那样深入研究。这对于在不影响现有属性的情况下向对象添加新属性也很有用。
发布于 2016-09-07 04:43:02
最好的解决方案是从对象中提取属性,并使其成为扁平点标记键值对。例如,您可以使用以下库:
https://www.npmjs.com/package/mongo-dot-notation
它具有.flatten
功能,允许您将对象更改为平面属性集,然后将这些属性提供给$set修饰符,而无需担心现有DB对象的任何属性将在不需要的情况下被删除/覆盖。
摘自mongo-dot-notation
文档:
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
}
}
*/
然后它会形成完美的选择器--它只会更新给定的属性。编辑:我有时喜欢做考古学家;)
发布于 2012-04-24 09:40:13
Mongo允许您使用.
约定更新嵌套文档。看一下:Updating nested documents in mongodb。这是过去关于合并更新的另一个问题,就像您正在寻找的那个I believe:MongoDB atomic update via 'merge' document
https://stackoverflow.com/questions/10290621
复制相似问题