如何更新Mongo中json列表中键的值

时间:2014-05-23 05:13:58

标签: mongodb mongodb-query mongo-java

我有一份文件---

   Employees:[
       {
          name:"abc",
          contact:"123",
          email:"xyz@gmail.com"
       },
       {
          name:"efg",
          contact:"456",
          email:"efg@gmail.com"
       },
       {
          name:"hij",
          contact:"789",
          email:"hij@gmail.com"
       }
  ]

对于列表中的所有键名,我需要使用value =“abc”更新名称。

我尝试更新

db.collection.update(
    { "_id" : ObjectId("5308595e3256e758757b4d2f") }, 
    { "$set": { "Employees.name " : "abc" } } 
);

但是得到错误:不能使用部分(Employees of Employees.name)来遍历元素。

1 个答案:

答案 0 :(得分:30)

这些是在一个数组中,所以这就是你当前语句不起作用的原因。您有几个选项可以执行此操作,因为没有简单的语句可以执行此操作。

1。您知道数组中有多少元素,因此请使用" dot-notation"

明确设置它们
    db.collection.update(
        { "_id" : ObjectId("5308595e3256e758757b4d2f") }, 
        { 
            "$set": { 
                "Employees.0.name " : "abc",
                "Employees.1.name " : "abc",
                "Employees.2.name " : "abc"
            }
        } 
    );

2。您不知道但是准备发布此更新,直到返回"已修改"文档变为0.然后您可以在更新中使用位置$运算符,但这一次只能匹配一个元素:

     db.collection.update(
        { 
            "_id" : ObjectId("5308595e3256e758757b4d2f"),
            "Employees.name": { "$ne": "abc" }
        }, 
        { 
            "$set": { 
                "Employees.$.name " : "abc"
            }
        } 
    );

3. 检索文档并更新代码中的所有数组成员:

    var doc = db.collection.findOne({ 
        "_id": ObjectId("5308595e3256e758757b4d2f") 
    });

    doc.Employee.forEach(function(emp) {
        emp.name = "abc";
    });
    db.collection.update(
       { "_id": doc._id },
       { "$set": { "Employee": doc.Employeee } }
    )

这些是基本方法并且这样做,以及一些实际示例,说明为什么目前无法在单个语句中完成更新每个数组成员字段。