Пн goose: Как массово обновить измененные данные из find () - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть функция, которая может изменять большинство документов из find () .

Мне было интересно, как я могу сохранить измененный массив документов обратно в базу данных.

Например,

const items = await Item.find();

// Some modifications done in items array
for (let i = 50; i < 100; i++) {
  items[i].count = i
}

Здесь, как я могу сохранить измененный массив документов?

Что не работает :

  await items.save();

Некоторые идеи:

  1. Использование Item.collection.initializeOrderedBulkOp ();
  2. Использование Элемент .updateMany ()
  3. Обновите каждый измененный документ следующим образом:
items.forEach(item => Item.update({_id: item._id}, {$set: {count: count}})

Каким будет эффективный путь к go отсюда?

1 Ответ

1 голос
/ 23 февраля 2020

Есть похожий вопрос. Не в "mon goose" конкретно, или, по крайней мере, еще не в письменной форме. Оболочка MongoDB начиная с версии 2.6 фактически использует «API массовых операций» «под капотом», как это было для всех основных вспомогательных методов. В своей реализации он сначала пытается сделать это, и если обнаруживается сервер более старой версии, то существует «запасной вариант» для унаследованной реализации.

Все методы mon goose, «в настоящее время» использующие «устаревшая» реализация или ответ касающейся записи и основные c устаревшие методы. Но есть метод доступа .collection из любой данной модели mon goose, который по существу обращается к «объекту коллекции» из базового «собственного драйвера узла», в котором реализован сам mon goose:

 var mongoose = require('mongoose'),
     Schema = mongoose.Schema;

 mongoose.connect('mongodb://localhost/test');

 var sampleSchema  = new Schema({},{ "strict": false });

 var Sample = mongoose.model( "Sample", sampleSchema, "sample" );

 mongoose.connection.on("open", function(err,conn) { 

    var bulk = Sample.collection.initializeOrderedBulkOp();
    var counter = 0;

    // representing a long loop
    for ( var x = 0; x < 100000; x++ ) {

        bulk.find(/* some search */).upsert().updateOne(
            /* update conditions */
        });
        counter++;

        if ( counter % 1000 == 0 )
            bulk.execute(function(err,result) {             
                bulk = Sample.collection.initializeOrderedBulkOp();
            });
    }

    if ( counter % 1000 != 0 )
        bulk.execute(function(err,result) {
           // maybe do something with result
        });

 });

Основное преимущество заключается в том, что «mon goose method» фактически осознает, что соединение на самом деле еще не может быть установлено, и «ставит в очередь», пока это не будет завершено. Родной драйвер, в который вы «копаетесь», не делает этого различия.

Так что вы действительно должны знать, что соединение установлено каким-либо образом или в какой-либо форме. Но вы можете использовать собственные методы драйвера, если вы осторожны с тем, что делаете.

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