更新 Couchbase 中嵌套的 json 数组字段

Update nested json array fields in Couchbase

请分享您对如何更新以下字段的看法

"UserList": [ 
   { 
      "userAge":33,
      "empID":32,
      "empSal":120000,
      "userDept":{ 
         "deptId":1,
         "deptEmpCount":10,
         "deptNo":2
      }
   },
   { 
      "userAge":33,
      "empID":31,
      "empSal":120000,
      "userDept":{ 
         "deptId":1,
         "deptEmpCount":10,
         "deptNo":2
      }
   }
]

想在 empID 的基础上更新 deptEmpCountdeptId。 我还想删除基于 empID.

的对象

首先我想澄清一下,CouchDB 不是 Couchbase :)

UPDATE myBucket1 AS d 
SET o.empSal = "120001" FOR o IN d.UserList WHEN o.empID = 32 END

现在要删除,您只需执行类似的操作,只需使用 unset 关键字即可。 假设您在数组中有另一个名为 "dummy".

的字段
UPDATE myBucket1 AS d
UNSET o.dummy  FOR o IN d.UserList WHEN o.empID = 32 END

据我所知,因为我们讨论的是数组,所以您目前不能将它们结合起来。

请注意,您应该指定一个 where 子句。由于您只有一份文件,所以这并不重要,但在现实生活中,您应该这样做。

另请查看文档以获取更多说明 https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/update.html

除了 Roi Katz 回答更新多个数组字段并从数组中移除对象。

要更新数组元素,您必须使用 update-for 语法和最后一个示例 https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/update.html 更新 2 个字段,您必须使用 SET 子句,每个字段都有自己的 FOR。 取消设置你可以使用相同的方式。

UPDATE default AS d
SET u.userDept.deptEmpCount = u.userDept.deptEmpCount+1 FOR u IN d.UserList WHEN u.empID = 31 END,      
    u.userDept.deptId = 2 FOR u IN d.UserList WHEN u.empID = 31 END
UNSET u.userDept.deptNo FOR u IN d.UserList WHEN u.empID = 31 END
WHERE ...;

要从 ARRAY 中删除对象,您可以构造新数组并对其赋值

UPDATE default AS d
SET d.UserList = ARRAY u FOR u IN d.UserList WHEN u.empID != 31 END
WHERE ...;

如果您想通过使用子查询表达式(子查询的 FROM 子句使用父表达式的子查询)对 ARRAY 进行复杂的操作,并且能够对 ARRAY 作为文档源进行完整的SQL。

示例:删除 empID = 31 并按 empID 对数组进行排序并将数组大小限制为 5。

UPDATE default AS d
    SET d.UserList = (SELECT u.* 
                      FROM d.UserList AS u 
                      WHERE u.empID != 31 
                      ORDER BY u.empID  
                      LIMIT 5)
    WHERE ...;

将新对象添加到 UserList

UPDATE default AS d
SET d.UserList = ARRAY_APPEND(d.UserList, { "userAge": 34, "empID": 33, "empSal": 120000, "userDept": { "deptId": 1, "deptEmpCount": 10, "deptNo": 3 } })
WHERE ...

将新对象添加到 UserList,如果不存在,则更新它。

UPDATE default d
SET d.UserList = (CASE WHEN (FIRST u FOR u IN d.UserList WHEN u.empID = 33 END) IS MISSING
                       THEN ARRAY_APPEND(d.UserList,
                           { "userAge": 34, "empID": 33, "empSal": 120000, "userDept": { "deptId": 1, "deptEmpCount": 10, "deptNo": 3 } })
                       ELSE d.UserList END
                  END),
     u.userDept.deptId = 2 FOR u IN d.UserList WHEN u.empID = 33 END
WHERE ....