先定義了一個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); });