2017-11-01 15 views
0

PHP에서 MongoDB ODM 쿼리 빌더를 사용하여 일치하는 임베디드 문서 만 반환하는 데 문제가 있습니다. 각 임베디드 문서에는 생성시 생성 된 MongoID가 있습니다.Doctrine MongoDB ODM - 쿼리 빌더를 사용하여 일치하는 임베디드 문서 만 반환

{ 
    "_id" : ObjectId("59f889e46803fa3713454b5d"), 
    "projectName" : "usecase-updated", 
    "classes" : [ 
     { 
      "_id" : ObjectId("59f9d7776803faea30b895dd"), 
      "className" : "OLA" 
     }, 
     { 
      "_id" : ObjectId("59f9d8ad6803fa4012b895df"), 
      "className" : "HELP" 
     }, 
     { 
      "_id" : ObjectId("59f9d9086803fa4112b895de"), 
      "className" : "DOC" 
     }, 
     { 
      "_id" : ObjectId("59f9d9186803fa4212b895de"), 
      "className" : "INVOC" 
     } 
    ] 
} 

가 지금은 함께 (즉 클래스 내 기준을 충족 포함 된 문서가 클래스에서 데이터베이스에만 클래스에서 검색하려는 : 다음은 프로젝트 수집 의 내 문서 구조 특정 ID) .This 내가 쿼리 건물입니다 방법은 다음과 같습니다

$qb = $dm->createQueryBuilder('Documents\Project'); 
$projectObj = $qb 
    ->field('id')->equals("59f889e46803fa3713454b5d") 
    ->field('classes')->elemMatch(
     $qb->expr()->field("id")->equals(new \MongoId("59f9d7776803faea30b895dd")) 
    ) 
    ->hydrate(false) 
    ->getQuery() 
    ->getSingleResult(); 

먼저 내가 재치 일치를 h 프로젝트 ID 그러면 임베디드 문서 클래스 ID와 일치합니다. .I 또한 집계 쿼리 작성에 노력

{ 
    "_id" : ObjectId("59f889e46803fa3713454b5d"), 
    "projectName" : "usecase-updated", 
    "classes" : [ 
      { 
      "_id" : ObjectId("59f9d7776803faea30b895dd"), 
      "className" : "OLA" 
      } 
    ] 
} 

을하지만, 교리 (질문의 시작 참조) 전체 프로젝트 기록을 반환 :이 같은 만 포함 된 문서를 반환 OLA 그것을 기다리고 있었다

$qb = $dm->createAggregationBuilder('Documents\Project'); 
    $projectObj = $qb 
     ->match() 
     ->field('id')->equals($projectId) 
     ->field('classes._id')->equals(new \MongoId($classId)) 
     ->execute() 
     ->getSingleResult(); 

누군가가이 문제에 관해서 좀 도와 줄래 다음과 같이 여전히 결과는 동일하다 $match 집계에 내가 집계 빌더로 생성 된 쿼리는 무엇입니까? 어떻게 내가 위에서 언급 한 원하는 결과를 얻을 쿼리를 작성할 수 있습니다.

+1

ODM은 전체 문서에서 작동합니다. 앱에서 필터링하거나 [aggregation] (http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/aggregation-builder.html)을 사용하십시오. –

+0

@AlexBlex 나는 그걸로도 노력했지만 여전히 결과는 같았습니다. 집계 쿼리 작성기로 질문을 업데이트했습니다. – Seeker

+1

'찾기'와 정확히 일치하는 단일 '일치'단계를 사용하고 있습니다. 문서를 다시 모양 짓기 위해서는 적어도 [project] (https://docs.mongodb.com/manual/reference/operator/aggregation/project/#pipe._S_project) 단계가 필요합니다. 사용할 수있는 [배열 함수] (https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#array-expressions)를보십시오. –

답변

0

따라서 일부 문제가 발생하면 집계 빌더와 일치하는 포함 된 문서 만 검색 할 수 있습니다. 그래서 쿼리의 첫 번째 내가

$qb = $dm->createAggregationBuilder('Documents\Project'); 
    $classObject = $qb->match() 
     ->field("id", new \MongoId($projectId)) 
     ->project() 
     ->field("classes") 
     ->filter('$classes', 'class', $qb->expr()->eq('$$class._id', new \MongoId($classId))) 
     ->execute()->getSingleResult(); 

: Alex Bles 코멘트 @ 난 집계 함수 사용에 대한 자세한 생각할 수 있었고, 내가 $filter 배열 집계 함수를 발견하고 그것을 사용하여 건물의 쿼리를 시도하고 최종 쿼리는 다음과 같이이었다 덕분에 이렇게 프로젝트의 _id와 일치합니다. 그 프로젝트 내에서 $filter 배열 집계 방법을 사용하여 classes에 대한 결과를 예상했습니다. 결국 나는 _id에 의해 필터링 된 임베디드 문서를 가져올 수있었습니다. 이것이 동일한 문제로 미래에 누군가를 도울 수 있기를 바랍니다.