2016-10-28 2 views
2

데이터를 감안할 때 간단한 서브 쿼리 예 :MongoDB를 -

> db.parameters.find({}) 
{ "_id" : ObjectId("56cac0cd0b5a1ffab1bd6c12"), "name" : "Speed", "groups" : [ " 
123", "234" ] } 
> db.groups.find({}) 
{ "_id" : "123", "name" : "Group01" } 
{ "_id" : "234", "name" : "Group02" } 
{ "_id" : "567", "name" : "Group03" } 

나는 쿼리가 그룹 내에서 주어진 문서의 배열에있는 모든 그룹을 돌려 주어 메이크업 _ID 매개 변수를 제공하고 싶습니다 매개 변수 테이블. 그룹의 각 요소에 대해

  • _ID 공급에 따라 매개 변수 테이블에서

    1. 가져 오기 매개 변수 배열 에서 문서를 선택합니다

      똑 바른 솔루션은 여러 DB가 PyMongo에서 호출을 할 것 같다 그룹 컬렉션

    하지만 너무 많은 불필요한 오버 헤드가 발생합니다. DB에서 커스텀 JS를 실행하지 않고 MongoDB 내에서 더 빠르고 더 나은 방법이 있어야한다고 생각합니다. 또는 문서 기반 접근 방식을 무시하면서 약간의 관계를 정규화하여 데이터를 다시 구조화해야합니까?

    다시 나에게 당신은 통합 프레임 워크를 사용하여 단일 쿼리 내에서이 작업을 수행 할 수 있습니다 PyMongo DB 인터페이스

  • 답변

    5

    에서 작업 할 수있는 솔루션을 찾을 수 있도록 도와주십시오. 특히 parameters 컬렉션에서 groups 컬렉션으로 왼쪽으로 조인하려면 $lookup 연산자를 사용하는 집계 파이프 라인을 실행해야합니다.

    다음과 같은 파이프 라인을 실행 생각해

    db.parameters.aggregate([ 
        { "$unwind": "$groups" }, 
        { 
         "$lookup": { 
          "from": "groups", 
          "localField": "groups", 
          "foreignField": "_id", 
          "as": "grp" 
         } 
        }, 
        { "$unwind": "$grp" } 
    ]) 
    

    샘플 출력

    /* 1 */ 
    { 
        "_id" : ObjectId("56cac0cd0b5a1ffab1bd6c12"), 
        "name" : "Speed", 
        "groups" : "123", 
        "grp" : { 
         "_id" : "123", 
         "name" : "Group01" 
        } 
    } 
    
    /* 2 */ 
    { 
        "_id" : ObjectId("56cac0cd0b5a1ffab1bd6c12"), 
        "name" : "Speed", 
        "groups" : "234", 
        "grp" : { 
         "_id" : "234", 
         "name" : "Group02" 
        } 
    } 
    

    하여 MongoDB의 서버 버전이 $lookup 파이프 라인 연산자를 지원하지 않는 경우, 당신은 좋겠 다음과 같이 두 개의 쿼리를 실행해야합니다.

    ,
    # get the group ids 
    ids = db.parameters.find_one({ "_id": ObjectId("56cac0cd0b5a1ffab1bd6c12") })["groups"] 
    
    # query the groups collection with the ids from previous query 
    db.groups.find({ "_id": { "$in": ids } }) 
    

    편집 : (질문 이내) 예를 들어 데이터 세트의 필드 이름으로 집계 쿼리에서 필드 이름

    일치