如何转换多个Mongoose文档?

时间:2016-01-22 16:33:20

标签: node.js mongodb mongoose

我的每个模式都有一个名为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()函数。

提前谢谢你。

1 个答案:

答案 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;