我的每个模式都有一个名为toItem()
的方法,它将doc转换为更详细/人类可读的形式。如何创建toItems()
方法来为文档数组执行相同的操作?
我的示例架构:
var mongoose = require('mongoose');
var membershipSchema = new mongoose.Schema({
m : { type: mongoose.Schema.ObjectId, ref: 'member' },
b : { type: Date, required: true },
e : { type: Date },
a : { type: Boolean, required: true }
});
var accountSchema = new mongoose.Schema({
n : { type: String, trim: true },
m : [ membershipSchema ]
});
accountSchema.methods.toItem = function (callback) {
var item = {
id : this._id.toString(),
name : this.n,
members : []
};
(this.m || []).forEach(function(obj){
item.members.push({
id : obj.m.toString(),
dateBegin : obj.b,
dateEnd : obj.e,
isAdmin : obj.a
});
});
return callback(null, item);
};
var accountModel = mongoose.model('account', accountSchema);
module.exports = accountModel;
我尝试过使用静态,方法和第三方库,但没有任何清理工作。我想尽量保持简单/干净,并在模型文件中包含toItems()
函数。
提前谢谢你。
答案 0 :(得分:1)
您的toItem()
方法特定于架构/模型。您的toItems()
方法听起来更像是一种可以/将被所有模型使用的实用方法。如果是这样,我会在实用程序文件中创建toItems()
方法。您只需传入文档数组,实用程序方法就会在每个文档上调用单独的toItem()
方法。
例如:
var async = require('async');
var toItems = function (models, callback) {
models = models || [];
if (models.length < 1) { return callback(); }
var count = -1,
items = [],
errors = [];
async.forEach(models, function (model, next) {
count++;
model.toItem(function (err, item) {
if (err) {
errors.push(new Error('Error on item #' + count + ': ' + err.message));
}
else {
items.push(item);
}
next();
});
}, function (err) {
if (err) {
return callback(err);
}
if (errors.length > 0) {
return callback(errors[0]);
}
return callback(null, items);
});
};
module.exports.toItems = toItems;