首页 > 解决方案 > 如何更新 Cosmos Document DB 中存储的引用?

问题描述

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

我有一个这样的数据结构:

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);存储在用户中的此实体的引用再次将其存储在数据库中,则不会更新。用户仍然包含具有两个权限而不是三个权限的角色。

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

标签: spring-bootreferenceazure-cosmosdbupdates

解决方案


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

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


推荐阅读