2011-12-15 2 views
1

이 내 컬렉션이다 : (다 대다)는 MongoDB를 대다 검색

배우 :

{ 
_id: 1, 
name: "Name 1" 
} 

영화 :

{ 
    _id: 1, 
    name: "The Terminator", 
    production_year: 1984, 
    actors: [ 
      { 
       actors_id: 1, 
       role_id : 1 
      }, 
      { 
      actors_id: 2, 
      role_id : 1 
      } 
      ] 
} 

내가 얻을 수 없습니다 어떤 영화의 배우 목록

내가 이것을 가지고있을 때 문제가되지 않습니다 :

나는이 위의 구조를 만들 수있는 방법
{ 
    _id: 1, 
    name: "The Terminator", 
    production_year: 1984, 
    actors: [1,2,3,4,5] (actors id's) 
} 

var a = db.movies.findOne(name:"The Terminator").actors 
db.actors.find({"_id":{$in:a}}) 

하지만, 어떻게 난 단지이에서받을 수 있나요

[ 
{ 
    actors_id: 1, 
    role_id : 1 
}, 
{ 
    actors_id: 2, 
    role_id : 1 
} 
] 

:

경우, 나는이 var a = db.movies.findOne(name:"The Terminator").actors

가 나에게이를 반환 할 액터 이름을 얻기위한 배열 [1,2] (actors_id)

감사합니다. Zoran

에서 6,

답변

2

당신은하지 않는 것이 정수 (IDS)의 배열을 만들어야 할 것입니다. MongoDB에서 항상 문서를 쿼리하므로 특정 문서를 쿼리하여 필요한 모든 정보를 얻을 수있는 스키마인지 확인해야합니다. MongoDB에는 join/view와 같은 기능이 없습니다.

일반적으로 역 정규화가 가장 적합한 선택입니다. 스키마는 기존 관계형 데이터베이스 용으로 설계된 것처럼 보이므로 관계형 데이터와 함께 제공되는 스키마 디자인 원칙 중 일부를 시도하고 해지해야합니다.

특히 예를 들어, 영화를 쿼리 한 후 해당 정보를 가질 수 있도록 포함 된 배열에 액터 이름을 추가 할 수 있습니다.

마지막으로, 필요한 도구에 올바른 도구를 사용하고 있는지 고려하십시오. 너무 자주 사람들은 MongoDB가 완전히 빠르다는 "빠른 MySQL"이라고 생각합니다. 문서 데이터베이스는 RDBMS 및 k/v 상점과 매우 다릅니다. 관련 데이터가 많은 경우 RDBMS를 사용하십시오.

+0

나는 당신의 대답 레몬에 감사합니다. 임베디드 배열에 ID 대신 이름을 지정하면 액터 이름을 업데이트하려면 별도의 컬렉션으로 변경하고 ID를 통해 참조하는 대신 모든 영화를보고 변경해야합니다. – zugrina

+1

예, 정확히 그것이 의미하는 바입니다. 모든 영화에서 하나의 원자 적 쓰기로 매우 쉽게 업데이트 할 수 있지만 실행 시간면에서 헤비 웨이트 작업이 될 수 있습니다. 이것이 내가 올바른 도구를 사용하고 있는지 정말로 고려해야한다고 말한 이유입니다. 이 경우 질문해야 할 질문은 "배우가 이름을 변경하는 빈도는 얼마나됩니까?"입니다. 해답은 드문 경우이므로 며칠/주마다 업데이트를 실행해야합니다. –

0

변수 a 문서의 배열입니다, 그래서 당신은