2016-07-04 2 views
0

문서 배열 인 문서에서 일치하는 필드의 값 목록을 검색하려고합니다. $ in을 사용하면 OR 사이의 OR이됩니다. $ all을 사용하는 것이 더 논리적 인 것 같습니다. 예를 들어

:

컬렉션 : 문구 샘플 문서 :

{ 
    "locales": [ 
    { 
     "name": "BPT", 
     "internal_desc": "Entre 2 e 3 horas" 
    }, 
    { 
     "name": "JPN", 
     "internal_desc": "2 ~ 3 時間" 
    } 
    ] 
} 

검색어 :

db.phrases.find({"locales.name":{"$all":["BPT", "JPN"]}}) 

그러나 모든 성능면에서 나쁜 $을 제시 일부 게시물. 이것을 달성 할 다른 방법이 있습니까?

답변

1

$ all 대신 $를 사용하면 동일한 성능을 얻을 수 있습니다. 최종선은 $ all을 사용하여 성취하고자하는 것이 최선의 선택이라는 것입니다 (내 이해가가는 한). 그러나 $ all은 표현식의 첫 번째 요소를보다 선택적으로 만들어 최적화 할 수 있습니다. 예를 들어, "BPT"가 문서의 2 %에 나타나고 "JPN"이 문서의 20 %에 나타나면 "BPT"를 $ all 표현의 첫 번째 요소로 지정하는 것이 좋습니다. 이렇게하면 mongo는 $ all 표현식에서 연속되는 각 요소에 대해 더 적은 수의 문서를 필터링하기 만하면됩니다. 당신이 문서를 보았음에도 불구하고 그럼에도 불구하고 링크가 있습니다 : $all - mongodb

+0

안녕 @ 스튜어트, 가장 먼저 발생하는 값을 첫 번째 요소로 주셔서 감사합니다. 그것은 많은 의미가 있습니다. 그리고 네, 제 문제에 대한 당신의 이해는 정확합니다. – Nattyk

0

아래 쿼리에서와 같이 $ 및 구문을 사용할 수 있습니다.

db.phrases.find({$and : [ 
    {"locales.name" : "BPT"}, 
    {"locales.name" : "JPN"} 
    ] 
    }); 

아래 표시된 것처럼 explain 명령을 사용하여 쿼리를 실행할 때 db가 수행중인 작업을 보려면 쿼리에 대한 정보를 얻을 수 있습니다.

db.phrases.explain().find({$and : [ 
    {"locales.name" : "BPT"}, 
    {"locales.name" : "JPN"} 
    ] 
    }); 

그것은 일종의 당신에게 검색의 DB에 의해 사용 된 인덱스에 대한 정보를 제공하기 때문에 설명 명령은, 인덱스가 사용하는 DBS에 더 관련이 있습니다,하지만.

자세한 정보는 MongoDB 색인 및 explain()을 잠깐 살펴보십시오.

이 정보가 도움이되기를 바랍니다.

감사합니다,

닉.