Столбец идентификации в DocumentDB

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

Спасибо.


person Sandip Bantawa    schedule 02.11.2014    source источник


Ответы (2)


Насколько мне известно, DocumentDB не имеет такой концепции. Каждый документ в DocumentDB имеет свойство id, которое однозначно идентифицирует документ, но это поле id имеет строковый тип. При создании документа вы можете не указывать значение для этого поля, и DocumentDB присваивает идентификатор автоматически, но это значение является GUID. Таким образом, если вы хотите добиться функциональности типа автоматического увеличения, вам нужно будет справиться с этим самостоятельно. Однако имейте в виду, что это свойство типа строки, поэтому, даже если вы обрабатываете это самостоятельно, вам нужно будет дополнить строку нулями, чтобы значения возвращались в правильном порядке, т. е. 1, 2, 3 и т. д. вместо 1, 10, 11,... 19, 2, 20....

person Gaurav Mantri    schedule 02.11.2014
comment
можем ли мы исследовать данные в DocumentDb онлайн, как мы просматриваем большие двоичные объекты через проводник?? - person Sandip Bantawa; 02.11.2014
comment
Что вы можете. 3 варианта: 1) Сделайте это на портале предварительного просмотра (portal.azure.com). 2) Используйте My DocumentDB Explorer (geekswithblogs.net/shaunxu/archive/2014/09/17/). 3) Cloud Portam (Disclosure — это инструмент, который я создаю) — cloudportam.com/features/documentdb. - person Gaurav Mantri; 02.11.2014
comment
Даже на портале Azure есть проводник, только что нашел :-) - person Sandip Bantawa; 03.11.2014
comment
Это был первый вариант, который я перечислил выше :) - person Gaurav Mantri; 03.11.2014
comment
Да, но я не понял, потому что он был внизу и не выделен :-) - person Sandip Bantawa; 03.11.2014
comment
Это: DocumentDB assigns an id automatically обманывает. Сама DocumentDB этого не делает, это используемая вами библиотека автоматически генерирует поле id. DocumentDB будет жаловаться, если поле id отсутствует. - person Parziphal; 23.10.2015
comment
@Parziphal На самом деле, если значение свойства _id не предоставляется клиентом во время его вызова для выполнения вставки, оно создается системой (DocumentDB). На самом деле это внутреннее свойство _rid. azure.microsoft.com/en-us/documentation/articles/< /а> - person dmcquiggin; 21.08.2016

До сих пор (по состоянию на август 2016 г.) нет встроенных функций Identity; на форуме обратной связи для DocumentDB есть запрос, за который можно проголосовать здесь. Но имейте в виду, что автоматический счетчик несколько противоречит большинству принципов проектирования NoSQL.

Однако есть несколько подходов, которые можно использовать в качестве обходных путей, и оба имеют оговорку; первый способ - использовать Counter Document, обновленный в хранимой процедуре:

СОХРАНЕННАЯ ПРОЦЕДУРА И ВСТРЕЧНЫЙ ДОКУМЕНТ

  1. Создайте документ, который будет содержать свойство числового значения. Либо кэшируйте его самостоятельную ссылку, либо предпочтительнее создайте его с известным идентификатором, таким как «__DocumentType_Counter», а затем вы можете использовать UriFactory для создания ссылки на документ, которая обеспечивает эффективный «прямой» доступ к этому Counter Document.

  2. Создайте хранимую процедуру, которая принимает вставляемый документ, и Uri объекта Counter Document. В этой хранимой процедуре выберите значение счетчика, увеличьте его, назначьте его соответствующему свойству вставляемого документа и, если это будет успешно сохранено, сохраните увеличенное значение как обновление документа счетчика.

Этот подход будет работать, так как хранимые процедуры автоматически выполняются как транзакция.

Предостережение. Но в настоящее время Транзакции ограничены рамками Коллекции — вы не можете использовать этот подход с Counter Document в одной Коллекции при вставке Документа в другую.

РЕДИС

Второй вариант для изучения, который добавляет немного больше сложности и немного дополнительных затрат, и не полностью транзакционный с точки зрения увеличения и вставки документа (но, по моему личному опыту, обеспечивает большую пропускную способность). , заключается в создании кэша Azure Redis и сохранении значения счетчика в хранилище значений ключа Redis, которое затем запрашивается и увеличивается с помощью сценария LUA.

Это гарантирует, что запрос значения счетчика и его приращение является атомарной транзакцией, поскольку Redis является однопоточным, а сценарии LUA в основном блокируются до завершения (но выполняются очень быстро).

Также можно использовать команды MULTI-EXEC. У них есть свои проблемы, и их нужно изучить, чтобы понять, относятся ли они к вам.

Дополнительную информацию о транзакциях Redis можно найти здесь — Транзакции в Redis< /а>

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

Обновление: в ответ на комментарий относительно "добавления стоимости RU к каждой операции создания" и "сериализации всех операций записи" - да, очевидно, при использовании подхода Counter Document это тот случай, когда создание документов, требующих увеличенного свойства Identity; никакие другие вставки не будут затронуты.

Обе эти «затраты» необходимы для достижения желаемой функциональности при использовании DocumentDB, что по своей сути не поддерживает концепцию свойства Identity; сохранение в документ для обеспечения восстановления / непрерывности, сериализация для согласованности. Стоимость RU обычно незначительна, и для ее компенсации можно использовать такие методы, как пакетная обработка.

В настоящее время нет альтернативы DocumentDB, которая не сохраняет счетчик или сериализует записи, при этом гарантируя целостность для увеличенного счетчика от нескольких вызывающих объектов.

Совет Эндрю Лю из команды DocumentDB заключается в том, чтобы использовать Counter Document, как указано в связанном вопрос - также обратите внимание на комментарии под ответом Эндрю.

Поскольку хранимые процедуры предварительно компилируются в DocumentDB, они являются эффективным способом выполнения операций "> 1". Они также в настоящее время являются оптимальным способом выполнения транзакции. «Где-то» должно быть единственным источником истины для счетчика; как упоминалось ранее, одним из вариантов является Redis, но, как я указываю, он не является частью транзакции, которая будет отменена в случае сбоя вставки документа, что может быть или не быть приемлемым; в Event Sourcing, например, это не так.

person dmcquiggin    schedule 13.04.2016
comment
Сохраняя счетчик в документе, вы просто добавляете стоимость RU к каждой отдельной операции создания (стоимость+время чтения+записи counter документа, а также стоимость+время выполнения кода хранимой процедуры). И вы принудительно сериализуете все записи, так как вы будете блокировать counter документ для каждой операции создания. - person David Makogon; 05.06.2016
comment
@DavidMakogon - мне было бы очень интересно услышать ваше альтернативное предложение, в котором нет такого поведения. - person dmcquiggin; 10.08.2016