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 = "測試";
});
// 執(zhí)行完打印title,會發(fā)現(xiàn)修改不生效
console.log(docs);
修改的三種方法
// 不看文檔直接擼
const docs = await Model.find({});
const newDocs = docs.map(function (obj) {
return Object.assign({}, obj);
});
// 調(diào)用toObject或toJSON方法
const docs = (await Model.find({})).toObject();
// 調(diào)用lean方法
const docs = await Model.find({}).lean();
toObject 與 toJSON 傻傻分不清楚
我也懶得解釋了,直接看stack overflow。
有時候,你會需要transform
舉個栗子:MongoDB 時間類型存儲的是0時區(qū)時間,接口想要返回東8區(qū)時間;每次使用時都轉(zhuǎn)換一遍太繁瑣了,為什么不默認就返回東8區(qū)時間呢?
schema.options.toObject = schema.options.toJSON = {
transform: function(doc, ret, options) {
ret.date = ret.date.toEast8();
return ret;
}
}
用path也能實現(xiàn)相似功能
schema.path('date').get(function (date) {
return date.toEast8();
});
schema.set('toObject', { getters: true });
schema.set('toJSON', { getters: true });