gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:13:52 26 4
gpt4 key购买 nike

我对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com