Мне нужно обновить некоторые документы в одной коллекции и отправить массив обновленных документов _id
в другую коллекцию.Mongodb - возвращает массив _id всех обновленных документов
С update()
возвращает число обновленных элементов не идентификаторам, я пришел с следующее, чтобы получить массив:
var docsUpdated = [];
var cursor = myCollection.find(<myQuery>);
cursor.forEach(function(doc) {
myCollection.update({_id : doc._id}, <myUpdate>, function(error, response){
docsUpdated.push(doc._id);
});
});
Или я мог бы сделать:
var docsUpdated = myCollection.distinct("_id", <myQuery>);
myCollection.update(<myQuery>, <myUpdate>, {multi : true});
Я предполагаю, что вторая версия будет быстрее, потому что она дважды вызывает базу данных. Но оба кажутся досадно неэффективными - есть ли другой способ сделать это без многочисленных вызовов БД? Или я что-то смущаю?
После того как я искать некоторые связанные с ней пост здесь , кажется, ваш второй вариант может быть лучше ... – zangw
Да, моя проблема со вторым: что, если какое-либо из обновлений не удалось (например, потому что оно нарушило правила схемы) - тогда _id будет в массиве docsUpdated, но это doc не обновлялся. (Это только мне пришло в голову) – rubie
Ничего себе, возможно, [объемная операция] (https://docs.mongodb.org/manual/reference/method/Bulk/) может быть одним из вариантов для вас ... – zangw