2016-08-01 5 views
2

От имени FindOneAndUpdate() Я понимаю, что это атомная операция .C# MongoDb FindAndUpdate (many)

Что делать, если я хочу найти 10 предметов (ограничение (10)) и обновить их все одинаково?
Например, установите поле состояния для «в процессе»?

Является ли это атомарно достижимым с MongoDb? Возможно, есть встроенные функции в C#-драйвере? Я не хочу сам реализовывать 2PC, если это можно избежать :-) У меня есть другие потребители, которые также просят документы, поэтому я хочу избежать двойной обработки, хотя это не важно для моего бизнес-кейса.

Мотивация НЕ Использовать FindOneAndUpdate() 10 раз - это чисто сетевое взаимодействие (меньше болтовни и более высокая производительность). У меня нет требования к транзакционному поведению.

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

ответ

0

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

Поскольку кажется, что вы заинтересованы в том, чтобы быть более эффективным с отправкой команд на сервер, не так много, зависит от того, является ли операция атомарным сервером, вы можете использовать BulkWriteAsync(), который принимает IEnumerable<WriteModel<TDocument>> обновлений для выполнения сервер.

Это позволяет создавать обновления списка и выполнять их в одной операции на сервере. Во время этого процесса необходимо принять меры для правильной обработки неудачных записей. Взгляните на Документы MongoDB по этому поводу here.

 Смежные вопросы

  • Нет связанных вопросов^_^