2017-07-31 31 views
1

Mongoose非常新 - 我正在研究一個現有的項目,並已被賦予改變某些模型屬性的任務。我明白,如果一個模型包含這種類型什麼是包含'ref'但未指定類型的Mongoose模型屬性?

postedBy: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'User' 
} 

的屬性此屬性引用另一個模型/方案,並獲得訪問該鏈接的模型/架構一個需要populate它來訪問此屬性。

但在代碼中,我回顧(我沒寫),有這種類型的

contentTypes: [{ ref: 'ContentType' }], 
source: { ref: 'Source',required: true }, 

其中另一個模式引用的許多特性,但沒有類型。這是相同的關係,並暗示id?這是一個子文件嗎?

作爲一個額外的問題:如果在模型中我想引用鏈接模型(或模式)的屬性,我需要首先populate?也就是說,如果它是一個子文檔,我可以使用點符號,但如果它是「鏈接」文檔,我不確定。

+0

如果沒有類型,則會拋出錯誤TypeError:未定義類型'Source'在'source.ref'處。似乎是一個無效的模式定義。你能夠運行代碼來創建文檔嗎? –

+0

是的 - 這是我編寫了很多代碼後作爲初級開發人員加入的一個大型項目。我相信我看到了我的方式的錯誤,因爲所有這些模式都被傳遞給模型「工廠」,該工廠設置了os對象ID類型,我認爲這需要處理所有這些 - 我應該在代碼中進一步閱讀。 – Cerulean

+0

因此,在模型工廠中,我們有以下代碼片段: – Cerulean

回答

0

答案是,模型模式不是獨立存在,而是傳遞給模型「工廠」,從而爲其提供所需的屬性類型。

因此從該工廠下面的片段(下面)。我查看了mongoose-autopopulate的文檔,但我沒有看到autopopulate=true的含義。

new: function(name, properties, statics, methods, schemaMods) { 
// Add default definition to properties with references and load reference schemas 
Object.keys(properties).forEach(function(key) { 
    var modifiedProperty = (property) => { 
    if (property.ref) { 
     property.autopopulate = true; 
     property.type = mongoose.Schema.Types.ObjectId; 
    } 

    return property; 
    }; 

    if (Array.isArray(properties[key]) && properties[key].length === 1) { 
    properties[key][0] = modifiedProperty(properties[key][0]); 
    } else { 
    properties[key] = modifiedProperty(properties[key]); 
    } 
}); 
相關問題