2017-11-23 10 views
1

나는이 쿼리 구축 교리 ODM의 집계 빌더를 사용하려면 : 나는 Studio3T이 실행doctrine odm에서 여러 필드를 어떻게 합치시겠습니까?

db.TeamStandings.aggregate(

    // Pipeline 
    [ 
     // Stage 1 
     { 
      $match: { 
       "team.$id": ObjectId("5a1643fdf5d8741a883c2aeb") 
      } 
     }, 

     // Stage 2 
     { 
      $group: { 
       "_id": { "team": "team.$id" }, 

       // This is the sum of multiple fields 
       "games": { $sum: { $sum: ["$wins", "$losses", "$ties"] } }, 

       "wins": { $sum: "$wins" }, 
       "losses": { $sum: "$losses" }, 
       "ties": { $sum: "$ties" }, 
       "homeWins" : { $sum: "$homeRecord.wins" }, 
       "homeLosses" : { $sum: "$homeRecord.losses" }, 
       "homeTies" : { $sum: "$homeRecord.ties" }, 
       "roadWins" : { $sum: "$roadRecord.wins" }, 
       "roadLosses" : { $sum: "$roadRecord.losses" }, 
       "roadTies" : { $sum: "$roadRecord.ties" }, 
      } 
     }, 

    ] 
); 

을 다음과 같은 가지고 :

{ 
    "_id" : { 
     "team" : "team.$id" 
    }, 
    "games" : NumberInt(776), 
    "wins" : NumberInt(377), 
    "losses" : NumberInt(398), 
    "ties" : NumberInt(1), 
    "homeWins" : NumberInt(218), 
    "homeLosses" : NumberInt(170), 
    "homeTies" : NumberInt(1), 
    "roadWins" : NumberInt(159), 
    "roadLosses" : NumberInt(228), 
    "roadTies" : NumberInt(0) 
} 

나는 교리 ODM의 집계를 사용하여이 정확한 쿼리를 작성하려면 어떻게을 빌더?

+0

집합 빌더에 대한 광범위한 문서가 있습니다. http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/aggregation-builder.html – malarzm

+0

믿거 나 말거나, 나는 믿습니다. 그 페이지에 여러 번 왔습니다. 이것이 집합 빌더를 사용하여 시작한 방법입니다. 그러나 여러 필드를 합쳐서 합산 한 부분을 어디서 보지 못했습니다. 내가 찾고있는 구체적인 사례는 doctrine odm에 다음과 같이 쓰는 방법입니다. ' "games": {$ sum : { "$ wins", "$ losses", "$ ties"] }},' – markedphp

+0

doctrine odm'sum()'코드를 살펴본 후, doc-block은 다음과 같이 말합니다 : ' 에서 나온 모든 숫자 값의 합계를 계산하여 그룹 내의 각 문서에 적용합니다. 같은 그룹을 키로 공유하는 문서 비 숫자 값을 무시합니다. ' 하지만 그럴 수는 없습니다. 또는 더 많은 경우 집계 작성자를 이해하지 못합니다. – markedphp

답변

0

설명서가 명확하지 않기 때문에이 내용은 까다 롭습니다.

이론적으로, 당신은 거기 합 연산자를 중첩 된 하위 표현식을 작성하고 사용

$builder = $this->dm->createAggregationBuilder(\Documents\BlogPost::class); 
$builder->group() 
    ->field('id') 
    ->expression(null) 
    ->field('games') 
    ->sum($builder->expr()->sum('$wins', '$losses', '$ties')) 
; 

을하지만, 방법에 집계 빌더가 내장되어 있습니다 때문에, 꽤 함께 합 syntax을 이해하지 않습니다 다음 (잘못된) 결과의 결과 $project 단계 외부의 여러 표현 :

[{ 
    "$group": { 
     "_id": null, 
     "games": { "$sum": { "$sum": "$wins" } } 
    } 
}] 

이 문제를 해결하려면, 중첩 된 전자의 $add 연산자 대신 $sum를 사용 xpression :

$builder = $this->dm->createAggregationBuilder(\Documents\BlogPost::class); 
$builder->group() 
    ->field('id') 
    ->expression(null) 
    ->field('games') 
    ->sum($builder->expr()->add('$wins', '$losses', '$ties')) 
; 

이렇게하면 원하는 집계 파이프 라인이 만들어집니다. $project에 여러 인수를 허용하면서 $group에서, 그것은 하나의 인수를 허용 :이 이상한

이유는 $group$project 단계에서 사용하면 문서가 $sum에 대해 서로 다른 동작을 정의하기 때문이다. 그러나 $group의 중첩 된 표현식에서 어떻게 작동하는지 완벽하게 명확하지 않습니다. 게시 한 집계 파이프 라인이 $group 단계의 하위 표현을 볼 수 없으므로 여러 인수를 허용한다는 사실을 알 수 있습니다. 연산자를 만들 때 나는 반대를 가정했다 : $project 단계에서 $sum은 여러 인수를 받아 들여야하고 그렇지 않은 경우에는 하나의 인수 구문을 기본값으로 사용해야한다.

MongoDB ODM에서 티켓을 생성하고 쉽게 수정할 수 있는지 알아 보겠습니다.

+0

'-> add (...)'를 사용하여 보았습니다. ! 고맙습니다. 그리고 티켓을 만들어 주셔서 감사합니다.내가 따를 수 있도록 작성한 티켓의 링크를 게시 할 수 있습니까? 감사. – markedphp

+0

예, 거기에 있습니다. https://github.com/doctrine/mongodb-odm/issues/1678 – alcaeus