Требовать уникальное имя пользователя, когда в контейнере Users в качестве ключа раздела указан userId - PullRequest
0 голосов
/ 17 июня 2020

Я использую эту статью в качестве примера https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-model-partition-example с контейнером Users с userId и именем пользователя и ключом раздела как userId.

{
    "id": "54c7da13-f4b8-4668-90dc-7c1aa968a73e",
    "userId": "54c7da13-f4b8-4668-90dc-7c1aa968a73e",
    "type": "user",
    "username": "jeffw"
}

На моей странице создания пользователя я хотите убедиться, что имя пользователя уникально, прежде чем добавлять нового пользователя. Я попробовал предварительный запуск, но обнаружил, что «нельзя запускать хранимые процедуры или триггеры в нескольких логических разделах». Как мне убедиться, что при создании пользователя он выбрал уникальное имя пользователя? Я думаю, что могу изменить ключ раздела на имя пользователя, но почему в статье вместо этого используется userId?

РЕШЕНИЕ

См. Ответ от @ mark-brown.

Создайте уникальный ключ в контейнере Users и / username:

await database.Database.DefineContainer(name: "Users", partitionKeyPath: "/userId")
                            .WithUniqueKey().Path("/username").Attach()
                            .CreateIfNotExistsAsync();

Затем попробуйте создать нового пользователя с userId как «unique_username» и новым именем пользователя, которое пытается создать:

{
    "id": "06af2937-4677-4d27-a167-5517aa6d0ffd",
    "userId": "unique_username",
    "type": "unique_username",
    "username": "jeffw"
}

await _usersContainer.CreateItemAsync(uniqueUser, new PartitionKey("unique_username"));

Это вернет статус конфликта, если Такое имя пользователя уже существует. Пример здесь https://github.com/jwidmer/AzureCosmosDbBlogExample/blob/master/BlogWebApp/Services/BlogCosmosDbService.cs

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Изменение ключа раздела на имя пользователя не поможет, потому что в вашем контейнере может быть количество, кратное этому значению. Один из способов сделать это - создать новый раздел, в котором вы храните уникальный экземпляр для каждого имени пользователя и используете уникальный индекс в контейнере (уникальные индексы уникальны в пределах логического раздела).

Создайте новый type = "unique_user" и userId = "unique_user". Затем добавьте новую запись этого типа с новым именем пользователя по мере их регистрации. Это должно принести вам миллионы пользователей, не превышая лимит в 20 ГБ. Затем при создании нового пользователя сделайте вставку в контейнер с типом «unique_user» и идентификатором с новым именем пользователя. Если вы получите 201, сделайте еще одну вставку с type = "user" и остальными пользовательскими данными.

надеюсь, что это поможет.

0 голосов
/ 18 июня 2020

Вы можете настроить политику индекса для уникальных значений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...