如何更新mongoose的logging

我正在尝试更新循环中的logging字段,并注意该字段是一个数组,我的代码如下,

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: '' }, }); 

我不知道我哪里错了,任何人都可以帮我吗?

您可以使用批量写入操作 API来更新模型。 但是为了使用底层的批量操作API,你应该通过.collection模型中的.collection属性来访问它,在使用API​​之前,等待mongoose成功连接到数据库,因为Mongoose并不真正支持“initializeOrderedBulkOp( )“function,因为它不适用于mongoose的内部缓冲系统。

您可以实现类似以下的使用Promise来处理node.js中的批量API的asynchronous特性。

模型声明

 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); 

使用Promise进行批量更新的function:

 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); }); } }); }); } 

使用 initializeUnorderedBulkOp() 旧版MongoDB版本的替代function

 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) }); });