find()
함수 실습에 앞서 다음과 같은 데이터베이스와 콜렉션, 도큐먼트를 생성해주세요.
use test //데이터베이스 생성
db.createCollection("testCollection") //컬렉션 생성
db.testCollection.insert([
{"name": "alex", "age": 23, "sex": "m"},
{"name": "triss", "age": 21, "sex": "f"},
{"name": "morgan", "age": 24, "sex": "f"},
{"name": "ed", "age": 21, "sex": "m"},
{"name": "reina", "age": 23, "sex": "f"},
{"name": "george", "age": 22, "sex": "m"}
]) //도큐먼트 생성
그럼 find()
함수와 연산자를 이용한 다양한 활용법에 대해 알아보겠습니다.
우선 컬렉션 내부의 모든 도큐먼트를 확인하는 방법입니다.
db.컬렉션명.find()
db.컬렉션명.find({ })
특정 필드 값을 가진 도큐먼트를 검색하는 방식은 다음과 같습니다. 예시로 컬렉션에서 성별이 남자인 도큐먼트들을 찾아보겠습니다.
db.컬렉션명.find({필드: 필드값})
추가적으로, 굉장히 독특한 기능이 있는데요. find() 함수 뒤에 .pretty()
를 붙여주면 보기 편한 형태로 출력이 됩니다.
find()
함수의 기본형은 다음과 같습니다.
db.컬렉션명.find(쿼리, projection)
방금까지는 쿼리
를 생략했는데요. 쿼리
를 추가해서 이용하면 조건 필드만으로는 찾아내기 어려운 조건으로 검색을 할 수 있습니다. projection
은 투사라고도 하는데 이것 또한 마지막에 가서 다시 알려드리겠습니다.
그러면 find()
에서 사용할 수 있는 쿼리들에는 무엇이 있는지 알아보도록 하겠습니다.
첫 번째로 소개할 친구들은 비교 쿼리
입니다.
db.컬렉션명.find({필드명: {쿼리: 값}})
다음은 몇몇 쿼리들을 사용해본 결과입니다.
$sq
$gt
$ne
$in
다음은 논리 쿼리
입니다. 조건과 쿼리에 따른 결과를 반환하며, 조건은 2개 이상이 올 수 있습니다.
db.컬렉션명.find({쿼리: [{조건1}, {조건2}, ...]})
$or
요소 쿼리
는 검색 기능보다는 쿼리의 검색을 돕는 쿼리에 가깝습니다.
({필드: {쿼리: 값}})
/*
쿼리 값은 $exists면 true/false가 오고
$type이면 타입이 옵니다.
*/
평가 쿼리
는 좀 더 구체적인 검색 옵션을 지원합니다. 활용할 일도 그렇게 많지 않은 것 같고, 각 쿼리마다 사용법이 조금씩 달라서 자세한 내용은 참조 링크를 참조해주세요.
({필드: {쿼리: }})
배열 쿼리는 도큐먼트 필드의 값이 배열일 때 이용가능한 쿼리입니다.
({필드: {쿼리: }})
/*
$all은 쿼리 뒤에 내용이 [대괄호]에 담기고,
$elemMatch와 $size는 {중괄호}에 담깁니다.
*/
투사 쿼리
는 검색보다는, 검색 이후 후처리에 대한 연산을 담당합니다. 보통, 결과에서 n개의 결과를 가져오는 경우에 사용하게 됩니다.
find({쿼리}, {투사})
{필드.$: n} //n은 숫자
{필드: {$elemMatch: {속성: 값}}}
{필드: {$meta: "메타 키워드"}}
{필드: {$slice: n}}