修改嵌入式嵌入属性的值(MongoDB)

时间:2014-05-15 07:31:48

标签: mongodb

我想知道是否可以更新属性的嵌入式嵌入值(有两个深层次)?

例如,如果我有以下文件:

{
    _id: ObjectId("5372523e4f611ef8255c5735"),

    places: [
        {
            idPlace: 2,
            namePlace: "Name of the place 2",
            typePlace: "Type of the place 2"
            },
            screens: [
                {
                    idScreen: 1,
                    nameScreen: "Name 1 of the screen",
                    statusScreen: false
                },
                {
                    idScreen: 2,
                    nameScreen: "Name 2 of the screen",
                    statusScreen: false
                },
                {
                    idScreen: 3,
                    nameScreen: "Name 3 of the screen",
                    statusScreen: false
                }
        },
        {
            idPlace: 3,
            namePlace: "Name of the place 3",
            typePlace: "Type of the place 3"
            },
            screens: [
                {
                    idScreen: 5,
                    nameScreen: "Name 5 of the screen",
                    statusScreen: false
                },
                {
                    idScreen: 6,
                    nameScreen: "Name 6 of the screen",
                    statusScreen: false
                },
                {
                    idScreen: 7,
                    nameScreen: "Name 7 of the screen",
                    statusScreen: false
                }
        }
    ]
}

我想将'statusScreen'的属性'idScreen': 5的值修改为true。所以我尝试了以下命令(根据帖子Updating embedded document property in Mongodb):

db.mycollection.update(  {'places.screens': {$elemMatch: {'idScreen': 5} }},  { $set: { "online": true }},   { multi: true } );

但这会在我的文档根目录中创建一个属性'online': true,并且不会修改我所需属性的值。

你知道出了什么问题吗?

最佳

卢瓦克

1 个答案:

答案 0 :(得分:0)

理论上,您应该使用位置运算符$来匹配特定项并更新它。但问题是你需要使用两个位置运算符$来匹配位置中的位置并匹配屏幕中的位置。不幸的是,还不支持使用两个位置运算符,请参阅https://jira.mongodb.org/browse/SERVER-831

因此,您无法在一个查询中更新文档。

但是,您可以使用{' places.screens.idScreen':5}}查询找到所有必要的文档,然后根据数组中的已知位置更新文档。

编辑:更新数组中特定元素的代码

db.coll.update(
   {'places.screens.idScreen': 5},
   {$set:{"places.0.screens.0.statusScreen":true}} 
)