$ set所有嵌套文档的属性

时间:2015-06-25 08:32:24

标签: mongodb

我想知道如何设置所有嵌套文档的属性。

假设我有一个category文档,其中嵌套了item个文档:

{
  items: [
    {
      hidden: true
    },
    {
      hidden: true
    },
    ...
  ]
}

如何将项目的所有hidden属性更新为false

我试过这个:

db.categories.update({}, {$set: {'items.$.hidden': false}})

但是MongoDB给了我The positional operator did not find the match needed from the query. Unexpanded update: items.$.hidden。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

由于this issue

,您需要使用脚本进行更新

使用以下内容更新所有字段:

db.collection.find({
    _id: ObjectId("558bbd23fdf0f33ec7a067c8")
}).forEach(function(doc) {
    doc.items.forEach(function(items) {
    if (items.hidden == true) {
        items.hidden = false;
    }
    });
    db.collection.save(doc);
});

答案 1 :(得分:1)

您可以尝试以下更新,它使用游标方法 forEach() 来迭代游标并访问文档,获取items数组并循环遍历它并修改hidden字段,如下例所示:

db.test.insert([
    {
        "_id" : 1,
        "items" : [ 
            {
                "_id" : 1,
                "hidden" : true
            }, 
            {
                "_id" : 2,
                "hidden" : true
            }
        ]
    },
    {
        "_id" : 2,
        "items" : [ 
            {
                "_id" : 1,
                "hidden" : true
            }, 
            {
                "_id" : 2,
                "hidden" : true
            }
        ]
    }
])

db.test.find().forEach(function (doc){
    var items = [];
    doc.items.forEach(function (item){
        item.hidden = false;
        items.push(item);
    });
    doc.items = items;
    db.test.save(doc);
});

答案 2 :(得分:1)

更新整个集合中数组中的所有元素并不简单。您必须使用嵌套的forEach。

  

位置$运算符充当第一个元素的占位符   与查询文档匹配

请查看此discussion