2017-12-22 2 views
1

처음 Mongodb에서 조회 연산자를 사용하여 이상한 것을 발견했습니다. 다음과 같이 보이는 2 개의 간단한 컬렉션이 있습니다.

Book 
{ 
    "_id": 1, 
    "Title": "Some book name", 
    "AuthorId": 1, 
} 

Author 
{ 
    "_id": 1, 
    "Name": "Some Author", 
    "Location": "US" 
} 
enter code here 

또한 Book.AuthorId에 대한 인덱스가 있습니다.

내가 원했던 것은 미국 내 Authors 인 모든 Books을 쿼리하는 것입니다. 그래서 문서를 읽고 .. 나는이 쿼리를 내놓았다 : 위대한 작품을

db.Book.aggregate([ 
    { 
     $lookup: { 
      from: "Author", 
      localField: "AuthorId", 
      foreignField: "_id", 
      as: "author" 
     } 
    }, 
    { 
     $unwind: "$author" 
    }, 
    { 
     $match:{ "author.Location": {$eq: "US"}} 
    } 
]) 

합니다. 그러나 호기심에서 프로파일 링을 켜고 위 쿼리를 실행할 때 Mongo가 한 일을 보았습니다. 놀랍게도 읽은 각 책에 대해 저자가 한 번 조회 한 것을 알았습니다. $lookup 연산자를 사용하는 요점은 이전에 모든 저자를 볼 필요가 없었기 때문에 여기서 잃어 버렸습니다. 나는 아무 것도 모으려하지 않을 것이다 .. 조회가 나에게 도움이되지 않는다면 적어도 $group을 가짐 (적어도 나는 그렇게 생각한다 ... 내가 틀렸다면 나에게 계몽해라)

다음은 프로파일 링을 볼 수있다. 나는 쿼리를 실행한다 : enter image description here

+0

도구 프로파일 링과 출력을 참조하는 데 사용 않았다

db.Author.aggregate([ { $lookup: { from: "Book", localField: "_id", foreignField: "AuthorId", as: "books" } }, { $unwind: "$books" }, { $replaceRoot: { newRoot: "$books" } } ]) 

그리고 프로파일에

, 나는 하나 개의 쿼리를 참조? Robo 3T처럼 보이지만 어느 곳에서도 프로파일 옵션을 찾을 수 없습니다. – PirateApp

+1

@PirateApp 먼저 프로파일 링 레벨을 2로 설정해야합니다. db.setProfilingLevel (2), db.system.profile.find ({ }). 정리하고 다시 시작하려면 다시 0으로 설정하고 db.system.profile.drop()로 프로파일을 삭제하십시오. – jpgrassi

답변

0

음 .. 나는 이것을 달성하는 방법을 찾았다. 아무도 대답하지 않기 때문에 나는 내 자신의 답을주고있다.

그래서 내 쿼리의 순서를 "뒤집어"해야했습니다. 작성자를 필터링해야하기 때문에 먼저 필터를 사용하여 시작하고 $match 연산자를 사용합니다. 그것은 이미 기록을 줄일 것입니다. 그런 다음 책 문서 만 표시하려면 $unwind$replaceRoot입니다. 그래서 :

/* 1 */ 
{ 
    "op" : "command", 
    "ns" : "Test.Book", 
    "command" : { 
     "aggregate" : "Author", 
     "pipeline" : [ 
      { 
       "$lookup" : { 
        "from" : "Book", 
        "localField" : "_id", 
        "foreignField" : "AuthorId", 
        "as" : "books" 
       } 
      }, 
      { 
       "$unwind" : "$books" 
      }, 
      { 
       "$replaceRoot" : { 
        "newRoot" : "$books" 
       } 
      } 
     ], 
     "cursor" : {} 
    }, 
    "keysExamined" : 0, 
    "docsExamined" : 2, 
    "cursorExhausted" : true, 
    "numYield" : 0, 
    "locks" : { 
     "Global" : { 
      "acquireCount" : { 
       "r" : NumberLong(26) 
      } 
     }, 
     "Database" : { 
      "acquireCount" : { 
       "r" : NumberLong(13) 
      } 
     }, 
     "Collection" : { 
      "acquireCount" : { 
       "r" : NumberLong(12) 
      } 
     } 
    }, 
    "nreturned" : 4, 
    "responseLength" : 312, 
    "protocol" : "op_command", 
    "millis" : 1, 
    "planSummary" : "COLLSCAN", 
    "ts" : ISODate("2017-12-27T09:39:28.958Z"), 
    "client" : "127.0.0.1", 
    "allUsers" : [], 
    "user" : "" 
} 
관련 문제