Mongoose架构字段的额外属性?

时间:2016-08-10 16:11:32

标签: node.js mongodb mongoose

是否可以在Mongoose架构中向字段添加额外/自定义属性?例如,请注意以下字段中的name:属性:

var schema = mongoose.Schema({

    _id : { type: String, default: $.uuid.init },

    n   : { type: String, trim: true, name: 'name' },

    ac  : { type: Date, required: true, name: 'created' },
    au  : { type: Date, name: 'updated' },
    ad  : { type: Date, name: 'deleted' },
    am  : { type: String, ref: 'Member', required: true, name: 'member' }
});

我们希望系统中有大量文档,并希望尽可能多地保留空间。在此示例中,我们缩写了字段的名称(n vs name等)。我们希望在获取后使用额外的name字段来水合JSON对象。

1 个答案:

答案 0 :(得分:0)

您可以创建一个实例方法(我称之为toMappedObject,但您可以自由命名,但是您喜欢)可以通过检查每个字段的架构来执行转换,看它是否有一个name属性:

schema.methods.toMappedObject = function() {
  let obj = this.toObject();

  Object.keys(obj).forEach(fieldName => {
    let field = schema.tree[fieldName];
    if (field.name) {
      obj[field.name] = obj[fieldName];
      delete obj[fieldName];
    }
  });

  return obj;
}

// Example usage:
let doc = new Model({...});
let obj = doc.toMappedObject();

或者,您可以将架构配置为自动转换toJSON生成的输出,虽然它更隐含,因此容易忽略以防问题出现(我还没有对此进行测试)非常好):

schema.set('toJSON', {
  transform : function(doc, obj) {
    Object.keys(obj).forEach(fieldName => {
      let field = doc.schema.tree[fieldName];
      if (field.name) {
        obj[field.name] = obj[fieldName];
        delete obj[fieldName];
      }
    });

    return obj;
  }
});

// Example usage:
let doc = new Model({...});
console.log('%j', doc); // will call `doc.toJSON()` implicitly