在MongoDB中使用关系
问题描述:
我有两个集合即Employees和Departments。在我使用的has_many和belongs_to的在MongoDB中使用关系
class Employee
include Mongoid::Document
field :name, type: String
field :age, type: Integer
field :empid, type: String
field :manager_id, type: Integer
field :department_id, type:Integer
attr_accessible :age, :empid, :name, :department_id, :manager_id
validates_presence_of :name
validates_uniqueness_of :empid
belongs_to :department
end
class Department
include Mongoid::Document
field :name, type: String
attr_accessible :name
has_many :employees
end
现在我想用员工指部门收集的_id,帮我
答
这个问题本质上是有缺陷的,从给从部门参照员工集合的部门标识场标题本身。您可能知道,但Mongo不是关系数据库,因此您应该避免将其用于高度关系数据模型。
Mongo没有JOIN查询的概念,所以简单的关系在查询中比在SQL数据库中要昂贵得多。
管理这种关系的传统方式是在关系的一边保留一个id列表。如果你更经常问“什么雇员属于部门x?”然后在每个Department对象上保留一份employee_ids列表。然后你可以通过id查找。如果您更经常问“员工属于哪个部门?”,那么您只需在每个员工对象上存储一个department_id,然后查询部门数据库。
如果您不需要在Departmental上下文之外使用员工,则可能需要考虑在Department对象中嵌入完整员工文档的列表。
我不熟悉Mongo for Rails,所以我不能给你具体的代码示例。
Mongo不是关系数据库,但它不是*反*关系。他们的关键是尝试和“嵌套”关系[例如部门班级将所有教师作为子对象]或者在代码中进行连接,而不是在数据库中进行连接。至少AFAIK。更多信息:http://www.mongodb.org/display/DOCS/Schema+Design如上所述,我会对此+1 :) – NPSF3000 2012-07-19 14:51:30
你是对的,但对于从mongo开始的人来说,最好让他们忘记关系模型并以面向文档的方式工作,那么当他们绝对需要关系时,他们可以以正确的方式进行。 – 2012-07-19 17:58:53