转换Mongoose查找函数返回的数组的结果

时间:2015-05-25 04:30:22

标签: node.js mongodb mongoose

我已向模式的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());,虽然效果很好,但我想知道是否有办法在返回的任何文档上自动触发转换 - 单个或数组,所以我不必迭代结果。

2 个答案:

答案 0 :(得分:1)

我已经创建了一个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执行相同操作。)

顺便说一句,已经有一个id虚拟属性,由mongoose定义(除非你在架构选项中将id设置为false

我这样使用它:

ItemSchema.plugin(cleanup);

答案 1 :(得分:0)

好吧,看了一会儿之后,我终于决定将结果转换为对象了。正如问题所述,我不是return items; return items.map(x => x.toObject());