mongodb любая идиома для свертывания 2 upserts в одно: создание, значения модификатора для установки по умолчанию, изменения модификатора для обновления существующего документа - PullRequest
0 голосов
/ 26 января 2012

Я хочу избежать двух операций для достижения следующего:

  1. Найти документ, обновить с модификатором-1.
  2. Если документ не существует, заполните поля по умолчанию модификатором-2, а затем обновите модификатором-1.

это обычная модель, поэтому она должна быть возможной. На данный момент мне нужно сделать два аппертиза. (не стесняйтесь настроить psuedocode, я новичок в языке запросов).

update( {...}, modifier-1, true)

if(upserted) 
{
    // check for race condition, detect if another query from another thread
    // hasn't populated the default values.
    update ( {...,if_a_default_value_does_not_exist}, modifier-2, true)
}

Я предполагаю, что две операции приведут к записи на два диска, я понимаю, что mongodb выполняет асинхронную запись на диск. Если я не могу сделать это с помощью одной операции, существует ли какой-то механизм, который бы объединял записи в одну запись перед записью в журнал / диск? И да, это существенно изменило бы загрузку моего набора данных объемом 300 ГБ: D

1 Ответ

1 голос
/ 27 января 2012

Hassan,

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

Журнал - это совсем другое дело - он записывается отдельно на диск идемпотентным образом в целях безопасности, чтобы упростить восстановление / восстановление в случае сбоя или других подобных проблем. Вы всегда можете запустить БД с отключенным ведением журнала, выполнить импорт, а затем перезапустить с включенным ведением журнала, как только массовое обновление будет выполнено, если записи журнала вызывают у вас серьезные проблемы.

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

Помимо массовых вставок, для единичных атомарных обновлений вы также можете изучить использование findAndModify (http://www.mongodb.org/display/DOCS/findAndModify+Command) для проверки и последующих изменений для вас, на основании описания трудно сказать, будет ли это подходящим вариантом, потому что у него есть свои недостатки.

...