更新 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
的基础上更新 deptEmpCount
和 deptId
。
我还想删除基于 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 ....
请分享您对如何更新以下字段的看法
"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
的基础上更新 deptEmpCount
和 deptId
。
我还想删除基于 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 ....