2017-01-05 3 views
1

Я пытаюсь обновить поле записи в цикле и обратите внимание, что поле является массивом, и мой код, как показано ниже,Как обновить запись в мангусте

Employeehierarchy = mongoose.model('Employeehierarchy'), 
    function (done) { 
     var ObjectId = require('mongoose').Types.ObjectId; 
     var item = {'childrens':{$in:[ ObjectId(employee.manager)]}}; 
     Employeehierarchy.find(item).exec(function (err, employeehierarchy) { 
     if (err) { 
      return res.status(400).send({ message: errorHandler.getErrorMessage(err) }); 
     } else { 
      if (employeehierarchy && employeehierarchy.length > 0) { 
       employeehierarchy.forEach(function (v1, i1) { 
       v1.parents = employee._id; 
       employeehierarchy = _.extend(employeehierarchy, v1); 
       employeehierarchy.save(function (err) { 
       }); 
      }); done(); 
      } else { 
      done(); 
      } 
     } 
     }); 
    }, 

моей схема,

var EmployeehierarchySchema = new Schema({ 
    name: { 
    type: String, 
    default: '' 
    }, 
    parents: { 
    type: Array, 
    default: '' 
    }, 
    childrens: { 
    type: Array, 
    default: '' 
    }, 
}); 

Я не знаю, где я ошибся, может ли кто-нибудь мне помочь?

+0

Было бы здорово, если бы вы могли использовать [редактировать] ссылку на свой вопрос, чтобы показать нам некоторый контекст, т. е. определение схемы модели emp' и пример данных для этой модели или массива 'emp'. – chridam

+0

Привет, chridam отредактировал мой код. – MMR

+0

Я могу обновить его, но не могу увеличить значение arrau i.e v1.parents и v1.childrens – MMR

ответ

1

Вы можете использовать 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) }); 
}); 
+0

Благодарим за предоставленную вам достоверную информацию. – MMR

+0

Можете ли вы ответить на мой еще один вопрос .... – MMR

+0

Конечно, дайте мне знать, как только у вас появится ссылка на новый вопрос. – chridam