Mongodb Explain for Aggregation 프레임 워크


118

MongoDB에 집계 프레임 워크에 대한 설명 기능이 있습니까? 문서에서 볼 수 없습니다.

확인할 수있는 다른 방법이없는 경우 집계 프레임 워크 내에서 쿼리가 어떻게 수행됩니까?

나는 당신이 그냥 할 찾기와 함께 알고

db.collection.find().explain()

하지만 집계 프레임 워크를 사용하면 오류가 발생합니다.

db.collection.aggregate(
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { 
        $group: 
        { 
            _id : { id: "$_id"},
            "count": { $sum:1 } 
        }
    },
    { $sort: {"count":-1}}
).explain()

답변:


172

MongoDB 버전 3.0부터 간단히 순서를 변경합니다.

collection.aggregate(...).explain()

collection.explain().aggregate(...)

원하는 결과를 얻을 수 있습니다 ( 여기에 문서 ).

2.6보다 큰 이전 버전의 경우 집계 파이프 라인 작업에 대한 옵션 을 사용해야합니다.explain

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

집계 프레임 워크 중요한 고려 사항 인덱스는 파이프 라인에 대한 초기 데이터를 가져 오는 데 사용할 수 있다는 것입니다 (예 : 사용 $match, $sort, $geonear파이프 라인의 시작 부분)뿐만 아니라 다음 $lookup$graphLookup단계. 데이터 처리 집약 파이프 라인으로 인출되어있다 (예처럼 단계를 통과하면 $project, $unwind, 및 $group)는 상기 조작에 메모리 (경우 생성 가능한 임시 파일을 사용할 것이다 allowDiskUse옵션 설정 됨).

파이프 라인 최적화

일반적으로 다음과 같은 방법으로 집계 파이프 라인을 최적화 할 수 있습니다.

  • 파이프 라인 시작 $match처리를 관련 문서로 제한 단계로 .
  • 효율적인 색인에 의해 초기 $match/ $sort단계가 지원 되는지 확인합니다 .
  • 필터링 데이터는 초기 사용 $match, $limit$skip.
  • 불필요한 단계 및 문서 조작 최소화 (복잡한 집계 체조가 필요한 경우 스키마를 재고 할 수 있음).
  • MongoDB 서버를 업그레이드 한 경우 최신 집계 연산자를 활용합니다. 예를 들어 MongoDB 3.4 는 배열, 문자열 및 패싯 작업 지원을 포함하여 많은 새로운 집계 단계 및 표현식 을 추가했습니다 .

또한 여러 집계 파이프 라인 최적화가 있습니다.MongoDB 서버 버전에 따라 자동으로 발생 있습니다. 예를 들어, 출력 결과에 영향을주지 않고 실행을 개선하기 위해 인접한 단계를 통합 및 / 또는 재정렬 할 수 있습니다.

한계

MongoDB 3.4에서와 같이 집계 프레임 워크 explain옵션은 파이프 라인 처리 방법에 대한 정보를 제공하지만 쿼리 executionStats모드 와 동일한 수준의 세부 정보를 지원하지 않습니다 find(). 초기 쿼리 실행을 최적화하는 데 중점을 두는 경우 해당 find().explain()쿼리를 executionStats또는 allPlansExecution자세한 수준으로 검토하는 것이 도움이 될 수 있습니다 .

집계 파이프 라인을 최적화 / 프로파일 링하는 데 도움이되는 더 자세한 실행 통계와 관련하여 MongoDB 문제 추적기에서 감시 / 찬성 할 몇 가지 관련 기능 요청이 있습니다.


정보를 제공해 주셔서 감사합니다. 변경할 수 있는지 확인하겠습니다.
SCB

$sort개체가 파이프 라인 배열 안에 있어야하지 않습니까?
JohnnyHK

@JohnnyHK : 네. 어떤 사람들은 대답을 잘못 "수정"하고 있습니다. :).
Stennie 2014 년

그러나 이것은 "executionStats"를 제공하지 않습니다
Kanagavelu Sugumar

1
@KanagaveluSugumar Aggregation Framework explain제한 사항과 추가 실행 통계에 대한 관련 기능 요청에 대한 설명으로 답변을 업데이트했습니다 .
Stennie

29

2.6.x 버전부터 mongodb를 사용하면 사용자 가 집계 프레임 워크로 설명 할 수 있습니다 .

당신이해야 할 일은 설명을 추가하는 것뿐입니다.

db.records.aggregate(
  [ ...your pipeline...],
  { explain: true }
)

Rafa 덕분에 2.4에서도 가능했지만 runCommand(). 그러나 이제 집계도 사용할 수 있습니다.


5
실제로 db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})MongoDB 2.2 이후로 집계를 설명 할 수 있습니다 .
Rafa

1
맞습니다. 2.2와 2.4에서는 runCommand를 통해서만 집계를 설명 할 수 있습니다. 투표 해 주셔서 감사합니다.
Rafa

3
옵션은 2.6 이전에 runCommand를 통해 기술적으로 존재하지만 올바른 결과를 생성한다고 보장 할 수 없으며 옹호해서는 안됩니다. 이 기능은 2.5.3 이상에서만 사용해야합니다 (2.6 프로덕션 릴리스 이전에는 여전히 버그가 숨어있을 수 있음).
Stennie 2013-12-03

20

집계 프레임 워크

집계 프레임 워크는 MongoDB하나 이상의 컬렉션에있는 문서에 대해 다양한 유형의 보고서 또는 분석을 실행할 수 있는 일련의 분석 도구 입니다. 파이프 라인의 아이디어를 기반으로합니다. MongoDB컬렉션 에서 입력을 받고 해당 컬렉션의 문서를 하나 이상의 단계를 통해 전달합니다. 각 단계는 입력에 대해 서로 다른 작업을 수행합니다. 각 단계는 출력으로 생성되기 전 단계가 무엇이든 입력으로 사용됩니다. 그리고 모든 단계의 입력 및 출력은 문서 스트림입니다. 각 단계에는 특정 작업이 있습니다. 특정 형식의 문서를 예상하고 특정 출력을 생성하며, 이는 그 자체가 문서 스트림입니다. 파이프 라인이 끝나면 출력에 액세스 할 수 있습니다.

집계 프레임 워크 단계

개별 단계는 데이터 처리 장치입니다. 각 단계는 한 번에 하나씩 문서 스트림을 입력으로 받아 한 번에 하나씩 각 문서를 처리하고 문서의 출력 스트림을 생성합니다. 다시 한 번에 하나씩. 각 단계는 우리가 원하는 작업을 수행하기 위해 단계를 매개 변수화하기 위해 제어 할 수있는 노브 또는 튜너 블 세트를 제공합니다. 따라서 스테이지는 일반적인 작업, 즉 일종의 범용 작업을 수행하고 작업중인 특정 문서 집합에 대한 스테이지를 매개 변수화합니다. 그리고 정확히 우리가 그 문서를 가지고 그 단계에서 무엇을하고자하는지. 이러한 튜너 블은 일반적으로 필드를 수정하고, 산술 연산을 수행하고, 문서의 형태를 변경하거나, 일종의 축적 작업과 기타 다양한 작업을 수행 할 수있는 연산자의 형태를 취합니다. 종종 우리가

단일 파이프 라인 내에서 동일한 유형의 단계 여러 번

예를 들어, 전체 컬렉션을 파이프 라인으로 전달할 필요가 없도록 초기 필터를 수행 할 수 있습니다. 그러나 나중에 몇 가지 추가 처리 후 다른 기준 세트를 사용하여 다시 필터링하려고합니다. 요약하자면 파이프 라인은 MongoDB컬렉션 과 함께 작동합니다 . 각 단계는 입력에 대해 다른 데이터 처리 작업을 수행하고 다음 단계로 전달할 출력으로 문서를 생성하는 단계로 구성됩니다. 마지막으로 파이프 라인의 끝에서 출력이 생성되어 애플리케이션 내에서 작업을 수행 할 수 있습니다. 대부분의 경우 개별 파이프 라인 내에 동일한 유형의 단계를 여러 번 포함해야합니다.


감사합니다, 더 나은 이해를 얻는 데 도움이되었습니다.
Arun Pratap Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.