Как сохранить документ JSON другой версии в dos cosmos, когда PK - это id, а UK - это id и версия - PullRequest
0 голосов
/ 08 июня 2018

У меня есть документ JSON с двумя свойствами deviceIdentity, version.

Ключ раздела для моей коллекции: deviceIdentity.

Мои документы JSON имеют разные версии. Я хочу сохранить все версииэтого документа.

Как:

deviceIdentity1, v1
deviceIdentity1, v2

Там должно быть два документа.

Проблема в том, что мой PK deviceIdentity, он всегда обновляет существующую записьхотя я определил ограничение уникального ключа для deviceIdentity, version.

введите описание изображения здесь

Любые указатели будут полезны!

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Спасибо за все ответы.

Проблема заключалась в том, что у нас есть старая унаследованная система, где «id» было уже широко используемым свойством, но оно не имело уникальных значений.

Так что всякий раз, когдадокумент поставляется с другой версией, которую он обновлял, так как «id» в космосе имеет предопределенное значение, то есть UPSERT любого поступающего документа выполняется с уникальным значением id, в нашем случае id никогда не бывает уникальным.

Решение, которое мы нашли.

Всякий раз, когда приходит документ, мы обрабатываем его в функции Azure, меняем столбец «id» на значение уникального значения «devicedentity» и сохраняем его, так как структура JSON не может быть изменена, как указано нашим клиентом ипри чтении этих документов мы выставили API, который снова выполняет обмен и отправляет документ запрашивающему клиенту как есть.

0 голосов
/ 13 июня 2018

Я полагаю, что вы путаете partition key с primary key.

Ключ разделения определяет, как данные масштабируются по горизонтали.Это не должно быть уникальным, так как в противном случае любое чтение, кроме точного поиска документа, потребует сканирования всех разделов, что будет неэффективно.В вашем случае deviceIdentity может быть подходящим кандидатом - все версии одного и того же устройства попадают в один и тот же раздел.

Первичный ключ - это идентификатор вашего документа (поле id).Как вы уже заметили, может быть только 1 документ с указанным id.Поле id ДОЛЖНО быть уникальным для каждого документа, который вы хотите сохранить.В вашем случае вы можете использовать комбинацию значений, таких как "deviceIdentity1, v2" в качестве идентификатора.Или вы можете использовать технический уникальный идентификатор, например, guid.

Также обратите внимание, что Уникальные ключи в Azure Cosmos DB :

Создавая уникальныйПолитика ключей при создании контейнера обеспечивает уникальность одного или нескольких значений на ключ раздела .

Это означает, что если ваш ключ раздела равен deviceIdentity, вам не нужно дублировать deviceIdentity в уникальной части ограничения.Ограничения на /version было бы достаточно, чтобы гарантировать, что каждый отдельный раздел / устройство имеет не более одного документа на версию.

...