гетерогенное массовое обновление в mongodb - PullRequest
9 голосов
/ 19 октября 2011

Я знаю, что мы можем массово обновлять документы в mongodb с помощью

db.collection.update( criteria, objNew, upsert, multi )

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

db.collection.update([{criteria1, objNew1}, {criteria2, objNew2}, ...]

, чтобы отправить несколько запросов на обновление, которые обновили бы, возможно, совершенно разные документы или класс документов за один вызов db.

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

Могу ли я сделать все это в одном комбинате в mongodb?

Ответы [ 3 ]

6 голосов
/ 19 октября 2011

Это два отдельных вопроса.К первому;нет собственного механизма MongoDB для групповой отправки пар критериев / обновлений, хотя технически выполнение этого в цикле само по себе должно быть примерно таким же эффективным, как и любая собственная поддержка групповых массивов.

Проверка существования документа на основевнедренный документ (который вы называете составным ключом, но в целях правильной терминологии, чтобы избежать путаницы, в этом случае лучше использовать имя монго) и вставлять / обновлять в зависимости от того, что проверка существования может быть выполнена с помощью upsert:

документ A:

{
    _id: ObjectId(...),
    key: {
        name: "Will",
        age: 20
    }
}

db.users.update({name:"Will", age:20}, {$set:{age: 21}}), true, false)

Этот переход (обновление со вставкой, если документ не соответствует критериям) будет выполнять одно из двух действий в зависимости от существования документа A:

  • Exists: выполняет обновление "$ set: {age: 21}" для существующего документа
  • Не существует: создайте новый документ с полями "name" и полем "age" со значениями "Will" и«20» соответственно (в основном критерии копируются в новый документ), а затем применяется обновление ($ set: {age: 21}).Конечным результатом является документ с "name" = "Will" и "age" = 21.

Надеюсь, что поможет

1 голос
/ 10 марта 2012

мы видим некоторые преимущества $ в предложении.наш вариант использования состоял в том, чтобы обновить «статус» в документе для большого числа записей.В нашем первом варианте мы делали цикл for и обновляли по одному. Но затем мы переключились на использование $ in, и это значительно улучшилось.

1 голос
/ 21 октября 2011

Нет реальной выгоды от обновления, как вы предлагаете.

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

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

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

Все, что может случиться, - это то, что Mongo поставит обновления в очередь и выполнит их последовательно (поскольку в каждый момент времени может происходить только одно обновление).), это точно так же, как если бы все обновления были отправлены отдельно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...