Вы можете использовать API Bulk Write Operations, чтобы обновить свои модели. Но для того, чтобы использовать базовый API транзакций, вы должны получить к нему доступ через свойство .collection
из модели mongoose и до использования API, дождавшись, пока mongoose успешно соединится с db, поскольку Mongoose на самом деле не поддерживает «initializeOrderedBulkOp() «функция пока, потому что она не работает с внутренней системой буферизации мангуста.
Вы можете реализовать что-то вроде следующего, которое использует обещания для обработки асинхронного характера массива API в node.js.
деклараций Модель
var mongoose = require('mongoose'),
express = require('express'),
Promise = require('bluebird'),
Schema = mongoose.Schema;
var employeeHierarchySchema = new Schema({
name: {
type: String,
default: ''
},
parents: {
type: Array,
default: ''
},
childrens: {
type: Array,
default: ''
}
});
var Employeehierarchy = mongoose.model('Employeehierarchy', employeeHierarchySchema);
Функция выполнять объемные обновления с помощью Promises:
function bulkUpdate(Model, query){
return new Promise(function(resolve, reject){
var ops = [],
collection = Model.collection;
Model.find(query).lean().exec(function (err, docs) {
if (err) return reject(err);
docs.forEach(function (doc){
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$push": { "parents": doc._id }
}
}
});
if (ops.length === 500) {
collection.bulkWrite(ops, function(err, result) {
if (err) return reject(err);
ops = [];
resolve(result);
});
}
});
if (ops.length > 0) {
collection.bulkWrite(ops, function(err, result) {
if (err) return reject(err);
resolve(result);
});
}
});
});
}
Альтернативная функция для более старых версий MongoDB, которые используютinitializeUnorderedBulkOp()
function bulkUpdate(Model, query){
return new Promise(function(resolve, reject){
var bulk = Model.collection.initializeUnorderedBulkOp(),
counter = 0;
Model.find(query).lean().exec(function (err, docs) {
if (err) return reject(err);
docs.forEach(function (doc){
counter++;
bulk.find({ "_id": doc._id }).updateOne({
"$push": { "parents": doc._id }
});
if (counter % 500 == 0) {
bulk.execute(function(err, result) {
if (err) return reject(err);
bulk = Model.collection.initializeUnorderedBulkOp();
resolve(result);
});
}
});
if (counter % 500 != 0) {
bulkUpdateOps.execute(function(err, result) {
if (err) return reject(err);
resolve(result);
});
}
});
});
}
Функция для подключения к MongoDB
function connect(uri, options){
return new Promise(function(resolve, reject){
mongoose.connect(uri, options, function(err){
if (err) return reject(err);
resolve(mongoose.connection);
});
});
}
Выполнить объемные обновления на связи
connect('mongodb://localhost/yourdb', {}).then(function(db){
var query = { "childrens": employee.manager };
bulkUpdate(Employeehierarchy, query).then(function(res){
console.log('Bulk update complete.', res);
}, function(err){
res.status(400).send({ message: errorHandler.getErrorMessage(err) });
db.close();
});
}, function(err){
res.status(400).send({ message: errorHandler.getErrorMessage(err) });
});
Было бы здорово, если бы вы могли использовать [редактировать] ссылку на свой вопрос, чтобы показать нам некоторый контекст, т. е. определение схемы модели emp' и пример данных для этой модели или массива 'emp'. – chridam
Привет, chridam отредактировал мой код. – MMR
Я могу обновить его, но не могу увеличить значение arrau i.e v1.parents и v1.childrens – MMR