2016-03-06 2 views
4

Мне нужно обновить некоторые документы в одной коллекции и отправить массив обновленных документов _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}); 

Я предполагаю, что вторая версия будет быстрее, потому что она дважды вызывает базу данных. Но оба кажутся досадно неэффективными - есть ли другой способ сделать это без многочисленных вызовов БД? Или я что-то смущаю?

+0

После того как я искать некоторые связанные с ней пост здесь , кажется, ваш второй вариант может быть лучше ... – zangw

+0

Да, моя проблема со вторым: что, если какое-либо из обновлений не удалось (например, потому что оно нарушило правила схемы) - тогда _id будет в массиве docsUpdated, но это doc не обновлялся. (Это только мне пришло в голову) – rubie

+0

Ничего себе, возможно, [объемная операция] (https://docs.mongodb.org/manual/reference/method/Bulk/) может быть одним из вариантов для вас ... – zangw

ответ

0

Я думаю, что нужно оператору курсора «.aggregate()»

db.orders.aggregate([ 
       { $group: { _id: "$_id"} } 
       ]) 

что-то вдоль этих линий, которая возвращает результаты всех идентификаторов в коллекции

Смежные вопросы