2014-12-22 3 views
0

단일 쿼리에서 (또는 가장 빠른 방법으로) 하나의 컬렉션에서 값 배열을 가져올 수 있으며 그 결과로 문서 묶음을 얻을 수 있습니까?여러 컬렉션의 필드에 대한 Mongo DB 쿼리

  collection2.find({bands: 'the killers'}, {eventId: 1}).toArray(function(err, docs) { 
       if(docs !== []){ 
        //get all the event ID's 
        var eventIds = []; 
        for(var i = 0; i < docs.length; i++){ 
         eventIds.push(docs[i].eventId); 
        } 

        //make a search with all ID's 
        collection.find({ _id: {$in: eventIds} }).toArray(function(err, docs){ 
         res.send(docs); 
        }); 
       } 
      }); 

그래서 여기에 살인자가 경기하고있는 모든 이벤트를 찾은 다음 모든 이벤트 ID를 가져 와서 전체 이벤트 정보를 가져옵니다.

밴드 목록이 상당히 커질 수 있으므로 밴드를 이벤트 정보와 결합하고 싶지 않았습니다. 또한 {bands : 0}과 같이 특정 필드를 무시할 수 있음을 알고 있습니다. 이는 밴드 배열이 큰 경우 검색어의 속도에 영향을 줍니까?

+0

예 물론 : – kaxi1993

+0

데이터를 관계형 방식으로 사용하려면 왜 관계형 데이터베이스를 사용하지 않습니까? MongoDB를 사용하고 싶다면 좋은 스키마 디자인을 배우는 데 약간의 시간을 할애해야만 MongoDB의 강점을 지속적으로 활용할 수 있습니다. –

답변

1

MongoDB는 조인을 수행하지 않습니다. 두 개의 콜렉션에서 정보를 조회 할 때 두 개의 조회가 필요합니다. 조인은 예제 코드 에서처럼 애플리케이션 측에서 수행된다. 스키마는 하나의 색인 된 쿼리로 쉽고 빠르게 수행 할 수 있도록 설계되어야합니다. 덜 일반적이고 덜 중요한 작업은 응용 프로그램 수준 조인, 집계 파이프 라인 또는 필요한 경우 매핑/축소로 수행 할 수 있습니다. 밴드와 관련된 이벤트 정보를 찾기 위해 조인을 피하기 위해 스키마를 최적화하는 것을 고려하고 싶지만 유스 케이스에 대한 지식이 거의 없으므로 어떤 것이 가장 좋은 코스인지 말할 수 없다.

생략 된 정보를 서버에서 클라이언트로 보낼 필요가 없기 때문에 쿼리 반환에서 특정 필드를 생략하면 쿼리 속도가 빨라집니다.