2017-03-06 99 views
0

我不確定在MongoDB中設置它的最佳方式。MongoDB爲每個用戶重複使用一個集合

我有兩個系列UserSkillSkill的集合具有每個用戶應具有的技能列表。

var SkillSchema = new Schema({ 
    name: { type: String, required: true, trim: true }, 
    category: { type: String, required: true, trim: true } 
}); 

mongoose.model('Skill', SkillSchema); 

var UserSchema = new Schema({ 
    _id: { type: String, required: true, trim: true }, 
    first_name: { type: String, required: true, trim: true }, 
    last_name: { type: String, required: true, trim: true }, 
    email_address: { type: String, required: true, trim: true }, 
    skills: [{ 
     skill: { type: ObjectId, ref: 'Skill' }, 
     count: { type: Number, default: 0 }, 
     last_performed: { type: Date } 
    }] 
}); 

mongoose.model('User', UserSchema); 

我所試圖做的是有技能列表,每個用戶都有一個count屬性,顯示他們有多少次執行的技能,並具有他們最後的演出之日起last_performed屬性。

我的問題是,我希望技能列表對於每個用戶都是相同的,但我可以爲每個用戶更新他們的countlast_performed屬性。

我目前掌握的方法是引用技能ID,然後在用戶架構中具有計數/日期。問題在於,如果我在技能架構中添加另一項技能,用戶的技能陣列將不會使用新技能進行更新。每次添加/刪除技能時,我都會更新每個用戶,以反映新的技能列表,但這不是實現此目的的最佳方式。

您是否可以同步用戶的技能數組以匹配技能模式?

直接將每個用戶的計數/日期添加到技能模式會更好嗎?唯一的問題是,如果有成千上萬的用戶,這是否會有任何性能問題,並且按照每個用戶的計數/日期對技能進行排序並且單獨查詢用戶的技能而不返回每個用戶的計數用戶?

乾杯, 本

回答

1

skills : [{ type: ObjectId, ref: 'Skill' }]。如果您希望在保存或更新時添加技能,只需將該ID推入陣列即可。

你可以填充技能數組,你可以計算技能數組。這會給你計數。

如果您在技能模型中有last_performed。那麼您將在填充後訪問它

+0

「count」屬性計算用戶執行技能的次數,而不是數量。對困惑感到抱歉。 'count'和'last_performed'屬性對每個用戶都是唯一的。 – Ben

+0

可能會更新技能中的計數,並且您仍然可以進行填充。我的意思是把數量放在技能模式中。也可以看看虛擬。 –

+0

謝謝,這似乎是最簡單的方法。我不確定是否在每個技能中存儲數千個「count」和「last_performed」值(每個用戶一次)在查詢或不查詢時會對性能產生影響。 – Ben

相關問題