在Node.js中使用MongoDB少不了Mongoose。 假設有如下Mongoose Schemas的定義: 我們希望在保存model數據時不用指定createTime欄位的值,按照上述Schema的定義,createTime會自動保存為系統當前時間。當然,在更新model數據時updateTi ...
在Node.js中使用MongoDB少不了Mongoose。
假設有如下Mongoose Schemas的定義:
var ItemSchema = new mongoose.Schema({ biz: String, name: String, tradeType: String, totalFee: Number, transactionId: String, createTime: { type: Date, default: Date.now }, updateTime: { type: Date, default: Date.now } }, { versionKey: false });
我們希望在保存model數據時不用指定createTime欄位的值,按照上述Schema的定義,createTime會自動保存為系統當前時間。當然,在更新model數據時updateTime欄位的值也能自動保存為系統當前時間。但是這裡有兩個問題:
1. Schema定義中含有default屬性的欄位在創建新文檔時會自動生成值,但是如果資料庫中缺少該欄位,讀取數據時也會自動生成值。例如上述schema所定義的表中先前保存進去的文檔如果沒有createTime欄位,則讀取數據時createTime欄位的值預設都是系統當前時間。這顯示不科學。
2. 我們並不能做到在每次更新文檔時自動更新updateTime欄位的值,所以這裡給updateTime欄位設置default屬性有點多餘。
那如何才能在schema定義中讓MongoDB自動生成和管理createTime和updateTime欄位的值呢?答案是使用timestamps選項。有關timestamps選項的作用可以看官方文檔的解釋http://mongoosejs.com/docs/guide.html#timestamps
我們將上述Schema的定義修改如下:
var ItemSchema = new mongoose.Schema({ biz: String, name: String, tradeType: String, totalFee: Number, transactionId: String, createTime: { type: Date, default: Date.now }, updateTime: { type: Date, default: Date.now } }, { versionKey: false, timestamps: { createdAt: 'createTime', updatedAt: 'updateTime' } });
添加了高亮顯示的部分。timestamps選項會在創建文檔時自動生成createAt和updateAt兩個欄位,值都為系統當前時間。並且在更新文檔時自動更新updateAt欄位的值為系統當前時間。如果想自定義這兩個欄位的名稱,則可以使用上述高亮部分的定義方法。如果使用預設的欄位名,則使用下麵的定義方法即可:
timestamps: true
在Mongoose中,定義資料庫model schemas時使用timestamps選項可以給我們帶來許多便利。在創建文檔時不用在代碼中去指定createTime欄位的值,在更新文檔時也不用去修改updateTime欄位的值。