2011-07-26 2 views
4

내 모델이 사용자 및 프로젝트라고 가정 해 보겠습니다. 각 사용자는 많은 프로젝트에 할당 될 수 있으며 각 프로젝트에는 많은 사용자가 할당 될 수 있습니다. 이것은 많은 관계 전형적인 여러이고 (source)로서 저장 될 수있다 :MongoDB (몽고이드) 추가 데이터 (추가 필드)와 다 대다 관계

문제는, I는이 관계를 기술하는, 예를 들어 더 많은 데이터를 할당하고자하는 것이다
# The user document. 
{ 
    "_id" : ObjectId("4d3ed089fb60ab534684b7e9"), 
    "project_ids" : [ ObjectId("4d3ed089fb60ab534684b7f2") ] 
} 

# The project document. 
{ 
    "_id" : ObjectId("4d3ed089fb60ab534684b7f2"), 
    "user_ids" : [ ObjectId("4d3ed089fb60ab534684b7e9") ] 
} 

사용자가 프로젝트 (관리자, 관리자 등)에 갖고있는 역할. RDBMS에서 조인 테이블에 추가 열을 추가하기 만하면됩니다. MongoDB에서 나는이 문제를 어떻게 해결할 지 모릅니다.

사용자 또는 프로젝트에 추가로 포함 된 문서를 만들어야합니까? 나는 이런 식으로 뭔가에 대해 생각했다 :

# The project document. 
{ 
    "_id" : ObjectId("4d3ed089fb60ab534684b7f2"), 
    "assigned_users" : [ 
    { user_id: ObjectId("4d3ed089fb60ab534684b7e9"), role: "admin" }, 
    ... 
    ] 
} 

하지만 난 지금 매우 복잡하게하는 모든 사용자의 프로젝트를 가져 오는 쿼리를 추측?

몽고이 (Mongoid)를 사용하고 있지만 어떤 일반적인 해결책에 대해서도 감사 할 것입니다. (그리고 나서 이것을 몽고이도에 매핑하는 방법을 생각해냅니다.) 또한 데이터베이스를 RDBMS로 변경할 수 없습니다.

답변

3

User에 대해 알고있는 모든 것을 저장하는 방법에 대해 Users 컬렉션에 저장 하시겠습니까?

{ 
    "_id": ObjectID("..."), 
    "projects": [ 
    { "role": "admin", "project_id": ObjectId("...") }, 
    { "role": "manager", "project_id": ObjectId("...") } 
    ] 
} 

쿼리는 Users 콜렉션에서 수행됩니다.

// find all admins on a project, for example 
db.Users.find({ "projects" : 
        { "role" : "admin", "project_id": ObjectId("...") } }) 
+0

마지막으로 프로젝트에 할당 된 사용자를 배치하는 방식을 취했습니다. 당신은 그 질문을하는 것이 어렵지 않을지라도 나를 모르게 만들어주었습니다. 'db.projects.find ({ "assigned_users.user_id": userId})'에 의해 모든 사용자 프로젝트를 나열 할 수 있습니다. –

+0

다행 이었기 때문에 기쁘다! – Pat

+0

@Juliusz Gonera, 어떻게 Mongoid에서 inverse mapping을 만들었습니까? 사용자가 둘 이상의 프로젝트에있을 수 있다면, 아마도'project_id' 배열을 필요로 할 것입니다. 그러나 몽고 이드는 그것을 유지하는 방법을 알지 못할 것입니다. –