如何更新 Cosmos Document DB 中存储的引用?

How to update stored references in Cosmos Document DB?

我对基于文档的数据库非常陌生,我在我的 Springboot 应用程序中使用 Azure 的 Cosmos 文档数据库。

我有这样的数据结构:

User:
{
    "firstname": "Bob",
    "password": "asdf",
    "roles": [
        {
            "rights": [
                {
                    "name": "RIGHT_READ"
                },
                {
                    "name": "RIGHT_WRITE"
                }
            ],
            "name": "ROLE_ADMIN",
            "id": "0d5299e0-836c-494d-9299-e0836c294d55"
        }
    ],
    "id": "0a9030f1-30f8-4d23-9030-f130f85d23e7",
    "email": "email@mail.com",
    "username": "admin",
    "lastname": "Martin"
}

Role:
{
    "rights": [
        {
            "name": "RIGHT_READ"
        },
        {
            "name": "RIGHT_WRITE"
        }
    ],
    "name": "ROLE_ADMIN",
    "id": "0d5299e0-836c-494d-9299-e0836c294d55"
}

用户存储了他被分配到的所有角色。在这种情况下,用户存储包含多个权限的角色 ROLE_ADMIN。

如果我现在正在更新角色 ROLE_ADMIN,例如通过添加权限,并通过 documentClient.replaceDocument(docLink, role, null); 将其再次存储在数据库中,存储在用户中的该实体的引用不会更新。用户仍然包含一个具有两个权限而不是三个权限的角色。

我是否必须手动更新所有参考资料,还是我遗漏了什么?

CosmosDB 是一个非关系数据库。如果您将它用作关系数据库,那么您必须手动执行所有级联更新,因为 CosmosDB 本身不知道您正在引用数据库中的另一个文档。每个文档都与另一个文档无关。

基于此示例,您还遇到了数据完整性问题。您将权限存储在角色对象和用户对象中。您应该做的是将权限存储在角色对象中,然后仅使用用户对象中的角色 ID 并根据角色 ID 查询权限。这样你只更新角色。