【问题标题】:Mongoose Schema for User profile, that has one to many properties用户配置文件的猫鼬模式,具有一对多属性
【发布时间】:2017-08-25 22:44:53
【问题描述】:

我以前使用 MySQL,现在对 Mongodb 很陌生。在学习阶段,我正在尝试创建一个像 LinkedIn 一样的用户配置文件。我很困惑选择在 mongodb 模式中创建一对多关系的正确方法。

上下文:用户可以拥有多个教育资格,并且具有相同的经验。这里有两种方法,我尝试将架构创建为:

示例 1

var userSchema = new mongoose.Schema({
  name: {
    first: String,
    middle: String,
    last: String,
  },
  gender: { type: Number, max: 3, min: 0, default: GENDERS.Unspecified },
  age: Number,
  education: [{type: Schema.Types.ObjectId, ref:'Education'}],
  experience: [{type: Schema.Types.ObjectId, ref:'Experience'}],
  email: String
});

示例 2

var userSchema = new mongoose.Schema({
  name: {
    first: String,
    middle: String,
    last: String,
  },
  gender: { type: Number, max: 3, min: 0, default: GENDERS.Unspecified },
  age: Number,
  education: [{type: String, detail: {
    major: String,
    degree: String,
    grade: String,
    startdate: Date,
    enddate: Date,
    remarks: String
  }}],
  experience: [{type: String, detail: {
    position: String,
    company: String,
    dateofjoin: String,
    dateofretire: String,
    location: String,
    responsibilities: [{type:String}],
    description: String,
  }}],
  email: String
});

我还没有测试过第二个选项。

在编写查询以获取或添加数据时,哪个更好、更容易?有没有更好的方法来为这样的场景编写模式?

【问题讨论】:

    标签: mongodb mongoose mongoose-schema


    【解决方案1】:

    对于这个特定的示例,我建议将文档嵌入与存储作为参考,这就是原因。

    通常我在 mongodb 模式设计中的第一步是考虑我将如何查询数据?

    我想知道某个用户的教育背景,还是想知道所有具有特定教育背景的用户?回答这些类型的问题将决定您要如何设置数据库。

    如果您已经了解您的用户,那么在该文档中嵌入教育背景可以快速轻松地访问。不需要单独的查询,并且模式仍然不是过于复杂和难以理解。这就是我希望您访问数据的方式。

    现在,如果您想找到所有具有特定教育背景的用户,嵌入式文档架构显然存在很大的缺陷。在这种情况下,您需要首先查看每个用户,然后遍历教育数组以查看所有不同的教育。

    因此,答案将取决于您将对数据进行的预期查询,但在这种情况下(除非您对所有用户进行报告),​​那么嵌入可能是可行的方法。

    您可能还会发现此讨论很有帮助:

    MongoDB relationships: embed or reference?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2011-11-14
      • 2019-07-12
      • 2017-01-08
      • 2020-03-10
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多