先定義了一個article的schema
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
exports.schema = new Schema({
title: String,//標題
description: String,//描述
content: String,//內容
status:{type: Number, defalut: 0}, //未發布:0 ,發布:1
create_at: {type: Date, default: Date.now}//添加時間
});
增加一條測試數據:
var o = new articleModel();
o.title = 'hello';
o.content = '這是一篇測試文章';
o.save(function(err,result){
if(err){
console.log(err.message);
}
console.log(result);
});
下面使用findOne方法獲取這條記錄,在獲取到的記錄上增加一個remark屬性,並在控制台輸出結果
articleModel.findOne({title: 'hello'}, function (err, article) {
article.remark = '備注';
console.log(article);
});
結果:{
"content":"這是一篇測試文章",
"title":"hello",
"_id":"56f5ee83fcfad37f1371e952",
"__v":0,
"status":0,
"create_at":"2016-03-26T02:05:55.814Z"
}
發現結果中remark屬性沒有顯示,同時在schema中聲明過的description也沒有顯示(因為增加數據的時候就沒有設置description的值)。我現在把description也設置一個值看看查詢結果:
articleModel.findOne({title: 'hello'}, function (err, article) {
article.remark = '備注';
article.description = '這是描述';
console.log(article);
});
結果:{"description":"這是描述",
"content":"這是一篇測試文章",
"title":"hello",
"_id":"56f5ee83fcfad37f1371e952",
"__v":0,
"status":0,
"create_at":"2016-03-26T02:05:55.814Z"
}
我們在發現description賦值成功,但是增加的remark屬性還是無效。
這是為什么呢?因為Mongoose是個ODM (Object Document Mapper),類似於操作關系型數據庫使用的ORM(Object Relational Mapper),我們使用Mongoose取到的數據的結構是要依賴於我們定義的schema結構的。增加的remark屬性在schema中沒有定義,所以我們在取到的結果中增加remark屬性是無效的,而description屬性先前在結構中有定義(不算新增),所以可以重新設置值。
結論:mongodb中使用mongoose取到的對象不能增加屬性。
接着問題是,如果我需要在結果中補充新的屬性使用怎么辦?
方法1、在schema中直接增加需要補充的屬性。
exports.schema = new Schema({
title: String,//標題
description: String,//描述
content: String,//內容
remark:String, //備注(補充新屬性,現在和description一樣了)
create_at: {type: Date, default: Date.now}//添加時間
});
方法2、把查詢到的結果clone一個對象,然后在新對象中補充屬性。
articleModel.findOne({title: 'hello'}, function (err, article) {
var newobj = null;
if(article){
newobj = {
_id:article._id,
title: article.title,//標題
description: article.description,//描述
content: article.content,//內容
remark:"備注",
create_at: article.create_at,
status: article.status,
status_name: article.status==1?'發布':'未發布';
};
}
console.log(newobj);
});
方法3:像上面的例子在schema中已經有了status表示狀態,如果我們僅僅需要一個status_name顯示文章狀態的中文解釋。不要clone新對象的方式,可以使用schema的虛擬屬性。
聲明修改一下如下:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var schema = new Schema({
title: String,//標題
description: String,//描述
content: String,//內容
status: {type: Number, defalut: 0}, //未發布:0 ,發布:1
create_at: {type: Date, default: Date.now}//添加時間
});
schema.virtual('status_name').get(function () {
return this.status == 1 ? '發布' : '未發布';
});
exports.schema = schema;
查詢到結果后可以直接使用status_name屬性:
articleModel.findOne({title: 'hello'}, function (err, article) {
console.log(article.stauts_name);
});
