У меня проблема с выполнением массового обновления в MongoDB:
function getNextSequenceValue(sequenceName)
{
// Some other code to be able to return an incremented int value...
return some_incremented_integer_value;
}
var bulk = db.TempContacts.initializeUnorderedBulkOp();
bulk.find({}).update({$set: {"indexId": getNextSequenceValue("currentId")}});
bulk.execute();
Когда я запускаю приведенный выше код, используя отдельные обновления, делая что-то вроде этого: ' db.TempContacts.find (). ForEach (update (indexId = getNextSequenceValue)) ', результат такой, как я Я стремлюсь к:
документ 1: indexId = 1,
документ 2: indexId = 2,
документ 3: indexId = 3,
* * Тысяча двадцать-одина и т.д.
Но когда я запускаю вышеописанную операцию массового обновления, все значения indexId получают одинаковое значение: функция оценивается только один раз, а возвращаемое значение устанавливается равным каждому indexId.
Поскольку обновления одного документа приводят к превышению времени ожидания (также при использовании пропуска и получения), я, вероятно, должен использовать механизм массового обновления. (Коллекция содержит около 8.000.000 документов, поэтому использование пропусков становится неработоспособным при увеличении значений пропусков.)
Эта строка имеет тот же эффект. Функция оценивается только один раз:
db.TempContacts.update({}, {$set: {"indexId": getNextSequenceValue()}}, false, true)
Возможно, есть ли другой способ заставить массовую операцию работать? Или, может быть, есть другой способ добиться добавления увеличенного целого значения в большую коллекцию?