如何正确设计mongo架构以使属于属于元素的元素在一起


var FamilySchema = new Schema({
  members: [String],
  indexedOn: {
    type: Date,
    default: Date.now
  },
  updatedOn: {
    type: Date,
    default: Date.now
  }
});

作为一个粗略的例子,我有一个Family,有很多成员,因此我使用的是上面显示的模式。但是一个家庭中可能有成千上万的成员,一个家庭只能在一个家庭中。因此,每次我遇到一个新成员时,我都必须搜索以查看他是否属于任何家庭,如果他这样做,请补充他。如果他不这样做,我必须创建一个新家庭并加入他。

这似乎是极低效率做事的方法。是否有更好的设计?

您可以使用数组并索引members的字段。

或,这是一种非常常见的MongoDB建模技术,可以避免使用数组(这意味着您可以为给定的家庭成员拥有更丰富的结构)。创建FamilyFamilyMember。正如您所说,每个家庭成员只能在一个家庭中,您将为FamilyMemberSchema添加一个字段作为Family的引用(使用ref,如下所示)。

var FamilySchema = new Schema({
  name: String,
  indexedOn: {
    type: Date,
    default: Date.now
  },
  updatedOn: {
    type: Date,
    default: Date.now
  }
});
var FamilyMemberSchema = new Schema({
  name: String,
  family_id: { type: Schema.Types.ObjectId, ref: 'Family' }
});
// you might want an index on these fields    
FamilyMemberSchema.index({ family_id: 1, name: 1});
var Family = mongoose.Model('Family', FamilySchema);
var FamilyMember = mongoose.Model('FamilyMember', FamilyMemberSchema);

然后,您可以使用查询为特定家庭提供所有家庭成员:

FamilyMember.find().where('family_id', 'AFAMILYID').exec(/* callback */);

您不需要使用ref,因为使用populate功能在您的情况下并不是特别有用(http://mongoosejs.com/docs/docs/populate.html),但它可以将架构定义更好地记录,所以我会使用它。

您可以使用两个收藏品,一个用于家庭,另一个用于成员。您可以使用成员集合中的字段来将其与另一个集合的一个家庭(例如" _id")链接。

当您必须添加新元素时,如果该元素已经存在,则可以在"成员"集合上搜索。索引可以帮助加快查询。

最新更新