MongoDB의 배열 연산자와 find의 두 번째 인자인 Projection을 이용해 쿼리하는 방법에 대해 알아보자.
도큐먼트에 너무 많은 필드와 정보가 있기 때문에 그 안의 정보를 확인하기 어려울 때가 있습니다. 이를 완화하기 위해 find 쿼리에 프로젝션을 추가해 현재 관심 있는 필드만 결과로 가져올 수 있습니다.
db.listingsAndReviews.find(
{"amenities":{"all":["Internet", "Wifi", "Kitchen", "Heating", ... ]}},
{"price":1, "address": 1}).pretty()
두번째 인자로 위와 같이 projection을 추가할 경우, price와 address 필드만 결과 커서에 포함됩니다.
db..find({},{})
:1 - 지정한 필드를 포함
:0 - 지정한 필드를 제외
프로젝션을 사용할 때, 0과 1을 사용해 결과에서 표시하거나 표시하지 않을 필드를 지정할 수 있습니다.
1을 사용하는 경우 지정한 필드와 _id 필드만 가져옵니다.
0을 사용하는 경우 지정한 필드를 제외한 모든 필드가 표시됩니다.
한 번의 프로젝션에서 0과 1을 혼합할 수 없습니다.
1과 0을 혼용할 수 있는 유일한 경우는 디폴트로 포함되는 _id필드를 제외하도록 특별히 요청할 때입니다. 이와 같은 요청이 없다면 _id필드가 기본적으로 도큐먼트에 포함되기 때문입니다.
elemMatch: 쿼리에 사용할 수 있는 배열 연산자.
결과에는 쿼리와 일치하는 모든 도큐먼트가 표시되었지만 도큐먼트의 모든 필드 값을 가져오지는 않았습니다.
find 명령에서는 첫 번째 인자인 쿼리에 해당하는 도큐먼트를 찾은 뒤 Projection합니다.
elemMatch는 쿼리의 프로젝션 뿐만 아니라 find명령의 쿼리 부분에서도 사용할 수 있습니다.
쿼리에 프로젝션이 없기 때문에 결과에 각 도큐먼트의 모든 필드가 포함됩니다.
db..find({},{})
projection에서 0과 1을 사용하여 특정 필드에 포함 또는 제외할 지 여부를 지정할 수 있습니다. 하지만 0과 1을 혼용해서 사용할 수 없습니다.
예외적으로 디폴트로 포함되는 _id 필드를 명시적으로 제외하는 경우 혼용해서 사용할 수 있습니다.
{"_id: 0", :1}
elemMatch {<field>:{"elemMatch":{:}}}
첫번째 인자에서 쓰일 경우, 배열 필드의 서브 도큐먼트 필드가 쿼리와 일치하는 문서를 찾습니다.
두번째 인자에서 쓰일 경우, 지정된 기준과 일치하는 요소가 하나 이상있는 배열 요소만 프로젝션합니다.
elemMatch는 지정된 쿼리와 일치하는 요소가 하나 이상 있는 배열 필드를 가지고 있는 도큐먼트를 찾을 수 있습니다.
그리고 지정된 기준과 일치하는 요소가 하나 이상 있는 배열 요소만 프로젝션합니다.