mongodb用mongoose取到的對象不能增加屬性


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM