修改Mongoose查询返回的对象

Mongoose查询返回的对象是不能直接修改的
//  以下代码不能直接运行,仅给出流程
const schema = new mongoose.Schema({
  title: String,
  date: Date,
  content: String
});

const Model = mongoose.model('test', schema);
const docs =  await Model.find({});

docs.forEach(function (doc) {
   doc.title = "测试";
});

// 执行完打印title,会发现修改不生效
console.log(docs);

修改的三种方法
// 不看文档直接撸
const docs =  await Model.find({});
const newDocs = docs.map(function (obj) {
  return Object.assign({}, obj);
});

// 调用toObject或toJSON方法
const docs = (await Model.find({})).toObject();

// 调用lean方法
const docs = await Model.find({}).lean();
toObject 与 toJSON 傻傻分不清楚

我也懒得解释了,直接看stack overflow

有时候,你会需要transform

举个栗子:MongoDB 时间类型存储的是0时区时间,接口想要返回东8区时间;每次使用时都转换一遍太繁琐了,为什么不默认就返回东8区时间呢?

schema.options.toObject = schema.options.toJSON = {
  transform: function(doc, ret, options) {
    ret.date = ret.date.toEast8(); 
    return ret;
  }
}

用path也能实现相似功能

schema.path('date').get(function (date) {
  return date.toEast8();
});
schema.set('toObject', { getters: true });
schema.set('toJSON', { getters: true });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容