ruby-on-rails - 建模多对多 :through with Mongoid/MongoDB

标签 ruby-on-rails ruby-on-rails-3 mongodb mongoid

我对 Mongoid/MongoDB 比较陌生,我有一个关于如何为特定的多对多关系建模的问题。

我有一个User 模型和一个Project 模型。用户可以属于多个项目,每个项目成员包括一个角色(例如“管理员”、“编辑者”或“查看者”)。如果我使用 ActiveRecord,那么我会使用 has_many :throughUserProject 之间建立多对多关联,然后我在连接表中放置一个角色字段。

在 MongoDB 中对这种情况建模的好方法是什么?我将如何使用 Mongoid 声明该模型?下面的示例似乎是对此建模的好方法,但我不知道如何使用 Mongoid 优雅地声明 User 和嵌入式 ProjectMembership 之间的关系关联。

提前致谢!

db.projects.insert(
  { 
    "name" : "Test project",
    "memberships" : [
      {
        "user_id" : ObjectId("4d730fcfcedc351d67000002"),
        "role" : "administrator"
      },
      {
        "role" : "editor",
        "user_id" : ObjectId("4d731fe3cedc351fa7000002")
      }
    ]
  }
)

db.projects.ensureIndex({"memberships.user_id": 1})

最佳答案

为良好的 Mongodb 模式建模实际上取决于您访问数据的方式。在您描述的情况下,您将索引您的 memberships.user_id 键,这似乎没问题。但是随着您添加查看者、编辑者和管理员,您的文档大小将会增加。此外,您的模式将使查询变得困难,例如:

查询项目,其中user_id xxx为editor:

同样,您可能不需要像这样查询项目,因此您的架构看起来不错。但是,如果您需要通过 user_id 和角色查询您的项目,我建议您创建一个“project_membership”集合:

db.project_memberships.insert(
  { 
    "project_id" : ObjectId("4d730fcfcedc351d67000032"),
    "editors" : [
      ObjectId("4d730fcfcedc351d67000002"),
      ObjectId("4d730fcfcedc351d67000004")
    ],
    "viewers" : [
      ObjectId("4d730fcfcedc351d67000002"),
      ObjectId("4d730fcfcedc351d67000004"),
      ObjectId("4d730fcfcedc351d67000001"),
      ObjectId("4d730fcfcedc351d67000005")
    ],
    "administrator" : [
      ObjectId("4d730fcfcedc351d67000011"),
      ObjectId("4d730fcfcedc351d67000012")
    ]
  }
)

db.project_memberships.ensureIndex({"editors": 1})
db.project_memberships.ensureIndex({"viewers": 1})
db.project_memberships.ensureIndex({"administrator": 1})

或者更简单...在您的项目架构上添加索引:

db.projects.ensureIndex({"memberships.role": 1})

关于ruby-on-rails - 建模多对多 :through with Mongoid/MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209072/

相关文章:

ruby-on-rails - 为什么这个简单的 Rails 迁移没有更新我的数据库?

ruby-on-rails - 在 Ruby 中使用正则表达式从 URL 中提取数字

ruby-on-rails - Rails error resource_name - 设计帮助路由和渲染

ruby-on-rails - 路由表单提交到不同的 Controller

java - mongodb根据父文档的搜索结果选择子文档

ruby-on-rails - 无法连接本地主机 :3000 ruby on rails in vagrant

ruby-on-rails - Rails 3 - 构建一个表,想要交替每行的颜色

ruby-on-rails - 安装 ruby​​-opencv (0.0.14) 时出错

android - 在 android 手机上使用 CouchDb,在服务器端使用 mongodb

javascript - Multer 看不到上传的图片