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

Sha*_*alu 12 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"
       }
  ]
Run Code Online (Sandbox Code Playgroud)

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

我试过更新像

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

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

Nei*_*unn 31

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

1.您知道数组中有多少元素,因此请使用"点符号"明确设置它们

    db.collection.update(
        { "_id" : ObjectId("5308595e3256e758757b4d2f") }, 
        { 
            "$set": { 
                "Employees.0.name " : "abc",
                "Employees.1.name " : "abc",
                "Employees.2.name " : "abc"
            }
        } 
    );
Run Code Online (Sandbox Code Playgroud)

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

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

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 } }
    )
Run Code Online (Sandbox Code Playgroud)

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