Сначала позвольте мне перевести ваш код 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));