了解MongoDB中的多对多关系以及如何取消引用集合

时间:2014-07-12 21:54:23

标签: javascript mongodb mongoose mean-stack

我花了一些时间研究MongoDB替代方案,以实现多对多关系,包括几个stackoverflow文章(herehere)和these幻灯片。

我正在使用MEAN堆栈创建一个应用程序,并且我试图确认我的架构设置和取消引用对象集合的最佳做法。

我在用户和会议之间建立了基本的多对多关系(考虑为用户安排会议,用户可以参加多个会议,会议包含多个用户)。

鉴于我的用例,我认为我最好使用引用而不是嵌入。我相信(从我所读过的内容),只有当我的会议拥有一次会议独有的用户时才最好使用嵌入。就我而言,这些相同的用户在会议中共享。此外,虽然更新用户不常见(例如,更改用户名,密码),但我仍然觉得使用引用感觉不错 - 尽管我对意见持开放态度。

假设我使用了引用,我有以下(简化)模式:

var MeetingSchema = new Schema({
  description: {
    type: String,
    default: '',
    required: 'Please fill in a description for the meeting',
    trim: true
  },
  location: {
    type: String,
    default: '',
    required: 'Please fill in a location for the meeting',
    trim: true
  },
  users: [ {
    type: Schema.ObjectId,
    ref: 'User'
  } ]
});

var UserSchema = new Schema({
    firstName: {
        type: String,
        trim: true,
        default: '',
        validate: [validateLocalStrategyProperty, 'Please fill in your first name']
    },
    lastName: {
        type: String,
        trim: true,
        default: '',
        validate: [validateLocalStrategyProperty, 'Please fill in your last name']
    },
    email: {
        type: String,
        trim: true,
        default: '',
        validate: [validateLocalStrategyProperty, 'Please fill in your email'],
        match: [/.+\@.+\..+/, 'Please fill a valid email address']
    },
    username: {
        type: String,
        unique: true,
        required: 'Please fill in a username',
        trim: true
    },
    password: {
        type: String,
        default: '',
        validate: [validateLocalStrategyPassword, 'Password should be longer']
    }
});

首先,您会注意到我没有在用户中收集会议。我决定不添加这个集合,因为我相信我可以使用MongoDB find的功能来获得与特定用户相关的所有会议 - 即,

db.meetings.find({users:ObjectId('x123')});

当然我需要添加一些索引。

现在,如果我希望将用户推荐给特定会议,我该如何做?对于那些了解rails并了解:include and :join我之间的不同寻找类似概念的人。我知道我们不是在处理MongoDB中的连接,但是对于我来说,为了从会议中取消引用用户集合以获得用户的名字和姓,我需要循环访问id的集合。并为每个id执行某种db.users.find()。我假设有一些简单的MongoDB调用可以让我以高效的方式进行调用。

1 个答案:

答案 0 :(得分:6)

有关MongoDB中架构设计的讨论,涵盖完全这个主题,我将在MongoDB博客上向您推荐这些帖子:

特别是,查看示例JavaScript代码,向您展示如何进行应用程序级联接。