6

想要在文档数组中插入对象属性

考虑集合 m 中的一个文档

{ "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"), 
 "x" : [       
    { "id":0.0, "name":"aaa"},{ "id":1.0, "name":"bbb"}  
 ]
}

想要添加age:100{ "id":0.0, "name":"aaa"}. 不仅仅是年龄..而是在数组元素 {} 中提供 upsert。所以它可以包含{age:100,"city":"amd"}(因为我是从应用程序服务中获取的)

正在尝试这个......但没有奏效,因为它替换了整个数组元素

db.m.update({_id:ObjectId("524bfc39e6bed5cc5a9f3a33"),
     "x" : {
                "$elemMatch" : {
                        "id" : 0.0
                }
}},
{
        $set : {
                "x.$" : {
                    "age": 100
            }
        }
},
{upsert: true}
)

将文档更改为(我不想要)

 { "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"), 
     "x" : [       
        { "age":100},{ "id":1.0, "name":"bbb"}  
     ]
    }

在不更改架构的情况下这是否可能。

4

2 回答 2

7
$set : {"x.$" : {"age": 100}}

x.$将整个匹配的数组元素设置为{age: 100}

这应该有效:

db.m.update({_id:ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x.id": 0.0}, {$set: {"x.$.age": 100 }});

使用elemMatch

db.test.update({x: {$elemMatch: {id: 1}}},{$set:  {"x.$.age": 44}})

请注意,upsert此处的选项是多余的,如果id不存在则将不起作用,x因为位置运算符$不支持upserting.

于 2013-10-02T12:11:49.173 回答
0

如果不更改架构,这是不可能的。如果您可以更改架构以使用对象来存储您的项目(而不是数组),则可以按照我在此答案中概述的方法进行操作。

于 2014-01-25T06:00:31.453 回答