【问题标题】:MongoDB reusing a collection for every userMongoDB为每个用户重用一个集合
【发布时间】:2017-07-25 23:47:13
【问题描述】:

我不确定在 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,然后在用户模式中包含计数/日期。这样做的问题是,如果我向技能模式添加另一个技能,用户的技能数组将不会使用新技能进行更新。我认为每次添加/删除技能时都更新每个用户以反映新技能列表,这不是执行此操作的最佳方式。

您能否同步用户的技能数组以匹配技能架构?

直接将每个用户的计数/日期添加到技能架构中会更好吗?唯一的问题是,如果有成千上万的用户,这是否会有任何性能问题,并且是否很容易按每个用户的计数/日期对技能进行排序,并单独查询用户的技能而不返回每个用户的计数用户?

干杯, 本

【问题讨论】:

    标签: node.js mongodb express mongoose mongoose-schema


    【解决方案1】:

    skills : [{ type: ObjectId, ref: 'Skill' }]。如果您想在保存或更新时添加技能,只需将 ID 推送到数组即可。

    您可以填充技能数组并计算技能数组。这会给你计数。

    如果您在技能模型中有last_performed。然后您将在填充后访问它

    【讨论】:

    • count 属性计算的是用户执行该技能的次数,而不是有多少技能。对困惑感到抱歉。 countlast_performed 属性对于每个用户也是唯一的。
    • 也许更新技能中的计数,你仍然可以填充。我的意思是把计数放在技能模式中。也可以看看 virtuals。
    • 谢谢,这似乎是最简单的方法。我不确定在每个技能中存储数千个 countlast_performed 值(每个用户一次)是否会在查询时影响性能。
    猜你喜欢
    • 2013-09-12
    • 2022-01-13
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多