2012-07-19 57 views
1

我有两个集合即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,帮我

回答

4

这个问题本质上是有缺陷的,从给从部门参照员工集合的部门标识场标题本身。您可能知道,但Mongo不是关系数据库,因此您应该避免将其用于高度关系数据模型。

Mongo没有JOIN查询的概念,所以简单的关系在查询中比在SQL数据库中要昂贵得多。

管理这种关系的传统方式是在关系的一边保留一个id列表。如果你更经常问“什么雇员属于部门x?”然后在每个Department对象上保留一份employee_ids列表。然后你可以通过id查找。如果您更经常问“员工属于哪个部门?”,那么您只需在每个员工对象上存储一个department_id,然后查询部门数据库。

如果您不需要在Departmental上下文之外使用员工,则可能需要考虑在Department对象中嵌入完整员工文档的列表。

我不熟悉Mongo for Rails,所以我不能给你具体的代码示例。

+2

Mongo不是关系数据库,但它不是*反*关系。他们的关键是尝试和“嵌套”关系[例如部门班级将所有教师作为子对象]或者在代码中进行连接,而不是在数据库中进行连接。至少AFAIK。更多信息:http://www.mongodb.org/display/DOCS/Schema+Design如上所述,我会对此+1 :) – NPSF3000 2012-07-19 14:51:30

+1

你是对的,但对于从mongo开始的人来说,最好让他们忘记关系模型并以面向文档的方式工作,那么当他们绝对需要关系时,他们可以以正确的方式进行。 – 2012-07-19 17:58:53