2016-11-29 27 views
0

我必須得到mongodb集合,我們稱它們爲parentschildren。這個父母/孩子的設計有一對多的關係,當我查詢父母時我也想要孩子。通過這一邏輯,是有意義的有這樣的模型設計:貓鼬 - 我應該將參考文獻添加到父文檔,子文檔還是兩者?

var ParentSchema = new Schema({ 
    name: String, 
    children: [{type: Schema.Types.ObjectID, ref: 'Child'}] 
}); 

var ChildSchema = new Schema({ 
    name: String 
}); 

這樣的話,我可以使用populate()輕鬆獲得與父母的子女。不過,我被告知,使用這樣的數組並不好,因爲它們可能會變得混亂。所以,如果我把對象引用放在ChildSchema中,那麼我可以避免使用這樣的數組。

var ParentSchema = new Schema({ 
    name: String 
}); 

var ChildSchema = new Schema({ 
    name: String, 
    parent: {type: Schema.Types.ObjectID, ref: 'Parent'} 
}); 

但是,如果我想再次與父母的孩子,populate()將無法​​正常工作。什麼是最好的使用模式,如果我在孩子們使用refs,有沒有類似於populate()的方法來做到這一點?我不喜歡爲了得到一個結果而進行查詢。

回答

4

我的理解是,存儲對父項中的子項的引用數組的問題將是兒童數組無界的情況。如果情況並非如此,我相信將推薦的模式存儲在「家長內的孩子」的引用數組中。如果孩子的數量非常大或無限,文檔建議使用虛擬技術。

我相信一個簡單的例子看起來像......

` 
var ChildSchema = new Schema({ 
     name: String, 
     parent: String 
}); 

var ParentSchema = new Schema({ 
     name: String 
}); 

ParentSchema.virtual('children', { 
     ref: 'Child', // the model to use 
     localField: 'name', // find children where 'localField' 
     foreignField: 'parent' // is equal to foreignField 
}); 


var Parent = mongoose.model('Parent', parentSchema); 
var Child = mongoose.model('Child', childSchema); 

/* 
Let's say we have two parents: Jack and Mindy 
And four children: Jake with Jack, and Mike, Molly, and Mildred with Mindy 
*/ 

Parent.find({}).populate('children').exec(function(error, parents) { 
/// parents.children is now an array of instances of Child. 
}); 

` 

有關人口更多的信息,這裏mongoosejs.com檢查出Mongoose.js文檔。

作爲我的例子,所有功勞歸於mongoosejs.com只是他們的改編。 此外,請注意,我在我的手機上回答此問題時,實際上並未測試此代碼。

希望這會有所幫助。

+0

我想這正是我想要的,謝謝!這種東西本質上是無法調整的 –

+0

這就是爲什麼我們都喜歡Stack Overflow;)很高興我能幫上忙。 – quarterpi