Космос SQL upsert не работает, как ожидалось - PullRequest
1 голос
/ 20 марта 2019

Я думал, что смысл upsert состоял в том, чтобы заменить документ, который уже существует.

Если я не создаю какие-либо поля как уникальные, он просто вставляет 2 отдельных документа.Если я создаю уникальное поле, например my_timestamp, и оба запроса имеют одно и то же значение в этом поле, я получаю исключение DocumentClientException (конфликт 409 - Документ с идентификатором, совпадающим с полем идентификатора документа, уже существует).

Я генерирую Id случайно с флагом false в методе upsertDocument Java client.upsertDocument(collectionLink, documentDefinition, null, false);.

В каком случае upsert заменит документ?Что мне здесь не хватает?

1 Ответ

2 голосов
/ 21 марта 2019

Поток Upsert / Replace в базе данных Cosmos DB основан на уникальном идентификаторе документа (id и значение ключа раздела). Уникальные поля предназначены для добавления дополнительных проверок для проверки данных.

Когда выполняется операция Upsert, служба будет искать существующий документ с тем же идентификатором и значением ключа раздела, если он есть, он обновит его, в противном случае он создаст его.

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

Пожалуйста, определите свой собственный идентификатор перед началом Upsert и установите для атрибута autogenerate id в вызове upsert его значение по умолчанию (true): client.upsertDocument(collectionLink, documentDefinition).

...