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

标签 javascript mongodb mongoose mean-stack

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

我正在使用 MEAN 堆栈创建一个应用程序,我正在尝试确认我的模式设置和取消引用对象集合的最佳实践。

我在用户和 session 之间有一个基本的多对多关系(想想为用户安排 session ,一个用户可以参加很多 session ,一个 session 包含多个用户)。

鉴于我的用例,我认为最好使用引用而不是嵌入。我相信(从我读过的内容来看)只有当我的 session 有单个 session 独有的用户时才使用嵌入会更好。在我的例子中,这些相同的用户在 session 之间共享。此外,尽管更新用户的频率不高(例如,更改用户名、密码),但我仍然觉得使用引用资料感觉不错 - 尽管我愿意听取意见。

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

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']
    }
});

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

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

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

现在,如果我想在特定 session 上尊重我的用户,我该怎么做?对于那些了解rails并且知道之间的区别的人 :include and :join我正在寻找类似的概念。我知道我们不是在处理 MongoDB 中的连接,但对我来说,为了从 session 中取消引用用户集合以获取用户的名字和姓氏,我需要循环访问 id 的集合并执行某种数据库。每个 id 的 users.find()。我假设我可以进行一些简单的 MongoDB 调用以使其以高效的方式发生。

最佳答案

有关 MongoDB 模式设计的讨论,完全涵盖了这个主题,我建议您引用 MongoDB 博客上的这些帖子:

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

关于javascript - 了解 MongoDB 中的多对多关系以及如何取消引用集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717660/

相关文章:

javascript - 如何在 Mongoose 模式中设置默认值

javascript - Uncaught ReferenceError : date is not defined | JavaScript NodeJs jQuery FileSystem

javascript - 强制 Highcharts 使用我的最小值和最大值

javascript - 显示/隐藏div关于下拉列表更改的问题

javascript - Mongoose 按数组条目 ($in) 进行搜索的行为与 MongoDB Atlas 不一致

node.js - 如何修改 Mongoose 查询的输出?

javascript - 使用 ui-sref 时不会自动生成 href

node.js - 如何在node.js、mongoose 中使用填充数据?

Java Spring Mongo 排序忽略大小写问题

javascript - 模块参数的 Node js module.exports