2015-01-05 3 views
4

Есть ли способ сделать массовые обновления в коллекции в мангусте? Стратегия Я нашел использовали необработанный драйвер коллекции следующим образом:Операция с массовым обновлением Mongoose

var bulk = Person.collection.initializeOrderedBulkOp(); 
bulk.find(query).update(update); 
... 
bulk.execute(callback) 

Однако bulk не определен, когда я делаю это. Это просто не поддерживается мангуста?

ответ

8

ПРИМЕЧАНИЕ: Современные релизы Mongoose поддерживают .bulkWrite() непосредственно на методах модели. Предпочтительно использовать этот метод даже при непосредственных реализациях API MongoDB, поскольку он фактически «безопасно понижает» для использования «индивидуальных вызовов» для методов, предоставляемых в пакете, в случаях, когда подключение к версии MongoDB, которая не поддерживает " Bulk API ".

Он по-прежнему вызывает те же основные «массовые методы», что и описано, но программное обеспечение принимает решение о том, как правильно отправить сервер, чем ваш собственный код, необходимый для принятия этого решения.

Также обратите внимание:, что текущие релизы мангуста теперь требуют вас .connect() таким образом, это означает, что соединение должна быть решена перед другими действиями по-прежнему. Использование новых механизмов подключения гарантирует, что аксессоры, такие как .collection, описанные ниже, всегда присутствуют при их вызове.


Вы можете сделать это, но проблема заключается в том, что при обращении к основной объект коллекции от базового драйвера одни и те же меры предосторожности не будут приняты, как и внедренных методов мангуст модели.

Все методы модели обертывают базовые методы другими функциями, но наиболее распространенным является то, что соединение с базой данных открыто, прежде чем пытаться получить доступ к этому методу. Это гарантирует, что Db экземпляр присутствует и Collection() объект может быть получен

После того, как вы используете .collection аксессор на модели, то вы делаете все это по своему усмотрению:

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

    // now it's safe to use 

    // { .. } Other code 
    var bulk = Person.collection.initializeOrderedBulkOp(); 
    bulk.find(query).update(update); 
    bulk.execute(callback) 

}); 

или какой-либо другой метод что в основном гарантирует, что соединение действительно установлено.

Что касается встроенной поддержки методов Bulk API без погружения в базовый уровень драйвера, да, в настоящее время это работает в настоящее время. Но вы все равно можете реализовать его самостоятельно, и он не будет нарушать код, если вы подключаетесь к экземпляру сервера MongoDB 2.6 или выше.

+0

@ bikash Если у вас есть другой вопрос, тогда [Задайте другой вопрос] (http://stackoverflow.com/questions/ask). Это объясняет причины «почему» «специальные методы для водителя» не срабатывают и как их убедиться. Все методы mongoose 'Model' фактически проверяют, должна ли база данных быть подключена до ее выпуска, а затем« очереди »до тех пор, пока она фактически не будет выполнена. –

3

Подробнее о запросе и запросе обновления.

var bulk = Person.collection.initializeOrderedBulkOp(); 
    bulk.find(query).update(update); 
    bulk.execute(function (error) { 
     callback();     
    }); 

Запрос ищет массив.
Update требуется $ набор

запроса является поиск идентификатор

var bulk = Person.collection.initializeOrderedBulkOp(); 
    bulk.find({'_id': id}).update({$set: {status: 'inactive'}}); 
    bulk.execute(function (error) { 
     callback();     
    }); 
+0

Это не работает для меня, я всегда получаю nMatched nModified как '0'. Что может быть возможной причиной? Это мой запрос – Dharshni

0
Person.collection.update(
    {'_id': id}, 
    {$set: {status: 'inactive'}}, 
    {multi: true}, 
    callback 
) 

в {'_id': id} ид является массив идентификаторов для записи, которые вы хотите обновить, на самом деле это где , вы можете установить свой собственный. в {$set: {status: 'inactive'}} статус - это поле, которое вы хотите обновить, вы можете указать свои собственные поля как пары ключ: значение. {multi: true} укажите, что эта операция будет обновлять несколько записей. callback имеет метод, который будет вызываться после успешного обновления.

+1

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

+1

отредактирован, чтобы добавить объяснения. @JensS –

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