我在模式的toObject中添加了一个转换函数来删除某些属性,并将_id的名称更改为id。当我对结果使用findOne并调用toObject时,它工作得很好,但我也有一个find({}, (err, items) => {...})命令。无法对数组调用toObject
这是我的方案:

var ItemSchema = new Schema({
    version: {type: String, default: '1.0.0'},
    created: {type: Date, default: Date.now},
    modified: {type: Date, default: Date.now},
    properties: Schema.Types.Mixed
  }, {
  toObject: {
    transform: (doc, ret) => {
      // remove the _id and __v of every document before returning the result
      ret.id = doc.id;
      delete ret._id;
      delete ret.__v;
    }
  }
});

我查过了,只能找到this question,这里推荐的答案是使用lean()——这对我没有帮助。
作为一种解决方法,我添加了一行var result = items.map(x => x.toObject());,虽然它工作得很好,但我想知道是否有方法在返回的任何文档(单个文档或数组)上自动触发转换,因此我不必迭代结果。

最佳答案

我已经创建了一个Mongoose插件来做这样的事情。

 var cleanup = function (schema) {
     var toJSON = schema.methods.toJSON || mongoose.Document.prototype.toJSON;

     schema.set('toJSON', {
         virtuals: true
     });

     schema.methods.toJSON = function () {
         var json = toJSON.apply(this, arguments);

         delete json._id;
         delete json.__t;
         delete json.__v;

         return json;
     };
 };

基本上,它覆盖toJSON(尽管您也可以使用toObject)。
顺便说一下,已经有了一个由mongoose定义的id虚拟属性(除非在schema选项中将id设置为false)。
我就是这么用的:
ItemSchema.plugin(cleanup);

09-18 11:59