我使用的是ouchbase Community Edition 5.0.1和java-client 2.7.4。我想将以下嵌套的json对象存储到couchbase中。如果我想更新同一个对象而不影响其他字段。
例如:
如何在不影响其他领域的情况下实现这一目标。
{
"doctype": "config:sample",
"group": [{
"name": "X Group",
"id": 1,
"players": [{
"name": "Roger Federer",
"number": 3286,
"keyword": "tennies"
},
{
"name": "P. V. Sindhu",
"number": 4723,
"keyword": "badminton"
}
]
},
{
"name": "Y Group",
"id": "2",
"players": [{
"name": "Jimmy Connors",
"number": 5623,
"keyword": "tennies"
},
{
"name": "Sachin",
"number": 8756,
"keyword": "Cricket"
}
]
}
]
}
答案 0 :(得分:0)
N1QL具有各种各样的功能,可以对阵列进行操作:
https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/arrayfun.html
根据您的情况,您可以简单地使用ARRAY_INSERT或ARRAY_PREPEND
答案 1 :(得分:0)
查看update / update-for语法(最后一个示例)http://127.0.0.1:8081/graphql
UPDATE default AS d
SET d.group = ARRAY_APPEND(d.group, {......})
WHERE .....;
UPDATE default AS d
SET g.players = ARRAY_APPEND(g.players, {......}) FOR g IN d.group WHEN g.id = 2 END
WHERE .....;
答案 2 :(得分:0)
如果知道要更新的文档ID,则可以使用键值子文档API,该API通常比通过N1QL进行单个文档更新要快。
这会将一个新玩家添加到X Group的“玩家”数组的末尾:
bucket.mutateIn(docId)
.arrayAppend("group[0].players",
JsonObject.create()
.put("name", "John Smith"))
// ... other player JSON
.execute();
这会将新的Z组添加到“组”数组中:
bucket.mutateIn(docId)
.arrayAppend("group",
JsonObject.create()
.put("name", "Z Group"))
// ... other group JSON
.execute();