Обновите несколько строк в MongoDB Java-драйвере - PullRequest
4 голосов
/ 13 сентября 2011

Я хочу обновить несколько строк в Моей коллекции под названием «Пользователи».Сейчас я обновляю обе строки по отдельности, но я хочу сделать то же самое в одном запросе.

Мой текущий код:

coll.update(new BasicDBObject().append("key", k1), new BasicDBObject().append("$inc", new BasicDBObject().append("balance", 10)));              
coll.update(new BasicDBObject().append("key", k2), new BasicDBObject().append("$inc", new BasicDBObject().append("balance", -10)));

Как сделать эти два отдельных обновления одним оператором?

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Сначала позвольте мне перевести ваш код Java в скрипт оболочки, чтобы люди могли его прочитать:

db.coll.update({key: k1}, {$inc:{balance:10}})
db.coll.update({key: k2}, {$inc:{balance:-10}})

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

set1 = getAllKeysForBalanceIncrease();
set2 = getAllKeysForBalanceDecrease();

db.coll.update({key:{$in:set1}}, {$inc:{balance:10}}, false, true)
db.coll.update({key:{$in:set2}}, {$inc:{balance:-10}}, false, true)

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

Предложение $ in может быть составлено в Java через:

ObjectId[] oidArray = getAllKeysEtc();
query = new BasicDBObject("key", new BasicDBObject("$in", oidArray));
0 голосов
/ 13 сентября 2011

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

public WriteResult update(DBObject q,
                      DBObject o,
                      boolean upsert,
                      boolean multi)

Но обратите внимание, что это не будет в транзакции.

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