簡體   English   中英

Mongoose toObject:{virtuals:true}

[英]Mongoose toObject: { virtuals: true }

我正在嘗試學習MongoDB / Node,我注意到在模式中我經常看到這樣的東西:

toObject: { virtuals: true }
toJSON: { virtuals: true }

這兩行是什么意思?

這不是“MongoDB”,而是特定於貓鼬ODM。

Mongoose在模式定義中具有“虛擬”字段的概念。 這基本上允許這個(文檔中明顯的收集):

var personSchema = new Schema({
    name: {
        first: String,
        last: String
    }
});

var Person = mongoose.model( "Person", personSchema );

但是假設你只是想“存儲”那些屬性,但是你可以在名為“fullname”的代碼中訪問它們。 這就是“虛擬”的用武之地:

personSchema.virtual("name.full").get(function () {
    return this.name.first + ' ' + this.name.last;
});

現在我們可以這樣做:

var bad = new Person({
    name: { "first": "Walter", "last": "White" }
});

console.log("%s is insane", bad.name.full); // Walter White is insane

所以name.full實際上並不存在於數據中,它只是代碼中的模式表示。 但是當然“綁定”到一個函數,該函數使用對象中存在的實際數據來創建一個方法,該方法返回一個值,該值組合了方法中每個代碼的兩個字段。

這基本上就是“虛擬”字段的含義。 它們實際上是在文檔“對象”上定義的“方法”,它呈現的值不是“存儲”或持久存儲在數據庫中。 通常它們基於數據存儲中的實際持久值。

但要真正澄清你的直接問題。 Mongoose默認只根據“存儲”字段“序列化”內部對象結構的內容。 那么這兩行“真正”意味着:

  1. toObject() :這將生成對象數據的“普通”或“原始”表示,而不包含擴展對象的所有其他“mongoose magic”部分。 但是“虛擬”的目的是使這些方法成為返回對象的一部分。 基本上只是普通對象,稱為:

      var model = Model.new({ "name": { "first": "Walter", "last": "White" }); console.log( model.toObject() ); 
  2. toJSON() :您可以顯式調用此方法,如上所示,但最常見的用法是從下面的JSON解析器中隱式調用它。 同樣的原則適用於上述。 “虛擬”包括序列化輸出中這些方法的結果,例如:

      var model = Model.new({ "name": { "first": "Walter", "last": "White" }); JSON.stringify( model, undefined, 2 ); 

所以第二種情況是對對象進行.toJSON()方法的“隱式”調用。 配置正在做的是告訴該方法不僅包括對象中存在的數據或“字段”,還包括定義的“虛擬”方法以及它們給出的輸出。 .toObject()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM