2013-10-08 3 views
1

MongoDB에 일부 트리 구조 데이터를 저장하고 있습니다.MongoDB에서 트리의 일부를 선택하십시오.

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "baz" 
     }, 
     { 
      "name": "gizmo" 
     }] 
    }] 
} 
{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

내가 하위 트리에 조회 할, 쿼리와 일치하는 트리의 일부를 추출하는 유일한 소원 : 그것은 다음과 같이 보입니다. 각 노드에는 쿼리와 일치하는 하위 트리가 하나만 있습니다.

이 테스트 쿼리에서 "foo/bar/gizmo"경로와 일치하는 트리 부분을 찾고 싶습니다.

db.Test.find({ 
    name: "foo", 
    subs: { 
     $elemMatch: { 
      name: "bar", 
      subs: { 
       $elemMatch: { 
        name: "gizmo" 
       } 
      } 
     } 
    } 
}, 
{ 
    "subs.subs": { 
     $slice: 1 
    } 
}) 

실제로

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
}{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

는이 작업을 수행하는 것이 가능 원한 반면 나는

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "baz" 
     }] 
    }] 
}{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

입니다 얻을 결과 : 그래서, 나는 다음과 같은 시도? 하위 트리에 $elemMatch 투영 연산자를 사용하려했지만 Mongo에서 현재 지원하지 않는 것 같습니다 (현재 지원되지 않는 중첩 필드에서 $ elemMatch 프로젝션을 사용할 수 없음).

+0

배열은 MongoDB의에서 많은 사랑을 부여하지 않습니다. 문서를 재구성해야합니다. – WiredPrairie

답변

0

원하는대로 결과를 얻으려면 집계 프레임 워크를 사용할 수 있습니다. 다음 코드를 사용해보십시오 :

db.Test.aggregate(
{$unwind : "$subs"}, 
{$unwind : "$subs.subs"}, 
{$match : {name : "foo", "subs.name" : "bar", "subs.subs.name" : "gizmo"}} 
); 

결과 같은 것 : 배열 내에서

"result" : [ 
    { 
     "_id" : ObjectId("52540da2e3a2c44e082642d4"), 
     "name" : "foo", 
     "subs" : { 
      "name" : "bar", 
      "subs" : { 
       "name" : "gizmo" 
      } 
     } 
    }, 
    { 
     "_id" : ObjectId("52540dd6e3a2c44e082642d5"), 
     "name" : "foo", 
     "subs" : { 
      "name" : "bar", 
      "subs" : { 
       "name" : "gizmo" 
      } 
     } 
    } 
]