db.COLLECTION_NAME.find(query, projection)
메소드의 리턴 값은 cursor 객체입니다. cursor 객체는 limit() 메소드, skip() 메소드, sort() 메소드 등을 가지고 있어 조회된 데이터를 핸들링 할 수 있습니다.
-> articles는 예시고 collection name을 입력하면 된다.
db.articles.find()
db.articles.find().pretty()
articles 의 다큐먼트 중 writer 가 Bravo 인 다큐먼트를 검색하려면 어떻게 하면 될까요?
db.articles.find({ "writer" : "Bravo" }).pretty()
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
find() 메소드를 사용할 때 비교나 정규표현식 등을 사용할 때는 Query 연산자를 사용합니다.
Query 연산자의 종류는 비교(Comparison), 논리(Logical), 요소(Element), 배열(Array) 등이 있습니다.
gt (greater than) 주어진 값보다 큰 값
lt (less than) 주어진 값보다 작은 값
ne (not equlas) 주어진 값과 일치하지 않는 값
nin (not in) 주어진 배열 안에 속하지 않는 값
articles 콜렉션 안의 다큐먼트 중 like 필드의 값이 10보다 크고 30보다 작은 다큐먼트를 조회하려면 어떻게 해야할까요?
db.articles.find( { "likes" : { $gt : 10, $lt : 30 } } ).pretty()
writer 필드의 값이 배열 ["Alpha", "Bravo"] 안에 속하는 값인 다큐먼트를 조회하려면 다음과 같이 명령어를 입력합니다.
db.articles.find( { "writer" : { $in : ["Alpha", "Bravo"] } } ).pretty()
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
논리 연산자의 종류는 다음과 같습니다.
*논리 연산자의 조건이 여러개 일 경우, 조건들을 배열안에 넣습니다.
Operator 설명
and 주어진 조건을 모두 만족해야만 true
nor 주어진 모든 조건이 거짓일 때 true
title 의 값이 "article01" 이거나 writer 의 값이 "Alpha" 인 도큐먼트를 조회하려면 다음과 같이 명령어를 입력합니다.
db.articles.find( { $or : [ { title : "article01" }, { writer : "Alpha" } ] } ).pretty()
*$and 연산자는 하나의 query 객체로 표현하는 것과 같습니다.
db.articles.find( { $and : [ { writer : "Alpha" }, { likes : { $gt : 20 } } ] } ).pretty() = db.articles.find( { writer : "Alpha", likes : { $gt : 20 } } ).pretty()
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
regex 연산자를 사용하는 방식은 아래의 네 가지 방법이 있습니다.
{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }
{ <field>: /pattern/<options> }
여기서 사용된 options 는 다음과 같습니다.
option 설명
i 대소문자를 무시하고 검색
m 정규식에서 (^) 를 사용 할 때(시작부분 검색) 줄바꿈을 무력화
x 정규식 안에 있는 공백을 모두 무시
s dot( . - any chracter) 사용시 줄바꿈을 포함해서 매치
만약 title 의 값이 정규표현식 article0[1-2] 를 만족하는 다큐먼트를 조회하려면 다음과 같이 명령어를 입력합니다.
db.articles.find( { title : /article0[1-2]/ } ).pretty()
*정규표현식에서 [ ] 는 문자 한 개를 의미, 대쉬(-) 는 ~에서 ~까지를 의미.
**[1-2] 1에서 2까지의 문자 한 개.
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
MongoDB 는 자바스크립트 기반이기 때문에 $where 연산자를 통하여 javascript expression 을 사용할 수 있습니다.
commnets 필드가 비어있는 다큐먼틀을 조회하려면 다음과 같이 명령어를 입력합니다.
db.articles.find( { $where : "this.comments.length === 0" } ).pretty()
$where 연산자의 값은 문자열로 입력합니다. (문자열로 자바스크립트 표현식을 사용)
this 는 article 안에 있는 document 들을 의미
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
$elemMatch 연산자는 도큐먼트 안에 있는 서브 도큐먼트(Embedded Document)들의 배열을 쿼리할 때 사용합니다.
우리가 사용하고 있는 예제에서는 comments 필드가 Embedded Document 를 포함하는 필드에 해당됩니다.
articles 의 도큐먼트 중 "Charlie" 가 작성한 덧글이 있는 도큐먼트를 조회하는 방법은 다음과 같습니다.
db.articles.find( { comments : { $elemMatch : { name : "Charlie" } } } ).pretty()
*위의 예제는 Embedded Document 가 배열안에 도큐먼트로 존재하는 형식이었습니다. 만약 Embedded Document 가 배열 안에 도큐먼트가 있는 형식이 아니라면 다음과 같이 처리합니다.
db.users.insert({
"username": "velopert",
"name": { "first": "M.J.", "last": "K."},
"language": ["korean", "english", "chinese"]
})
위의 코드와 같이 users 콜렉션에 도큐먼트를 하나 추가해 봅시다.
추가된 도큐먼트의 name 필드의 값은 도큐먼트 하나 입니다.(Embedded Document)
그리고 language 필드의 값은 배열인데, 배열의 원소들은 도큐먼트형식이 아닌 문자열 입니다.
이 도큐먼트에서 name 필드의 값인 도큐먼트의 first 의 값이 "M.J." 인 도큐먼트를 검색하려면 다음과 같이 합니다.
db.users.find({ "name.first" : "M.J."})
language 필드의 값의 배열 중 원소가 "korean" 인 도큐먼트를 검색할 때는 다음과 같이 합니다.
db.users.find({ "language" : "korean"})
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
이제 find() 메소드의 두 번째 파라메터인 projection 에 대해서 알아보도록 하겠습니다.
projection 은 query 의 결과 값을 보여줄 때 표시할 필드를 지정하는 것입니다.
articles 컬렉션의 모든 다큐먼트를 검색할 때 title 과 content 필드만을 보이고 싶다(projection)면 다음과 같이 합니다.
db.articles.find( {}, { _id : false, title : true, content : true } )
*projection 시 _id 필드를 제외한 모든 필드들은 기본값이 false 이다. _id 는 기본값이 true 이므로 _id 필드를 프로젝션하지 않으려면 _id 필드를 false 로 지정해 주어야 한다.
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
projection 의 $slice 연산자는 Embeded Document 배열을 불러올 때 갯수를 제한하는 역할을 합니다.
title 이 "article03" 인 도큐먼트의 덧글을 1개만 보이도록 조회
db.articles.find( { title : "article03" }, { comments : { $slice : 1 } } )
*원래 title 이 "article03" 인 도큐먼트의 덧글은 2개 이지만 projection 을 통해 한개만 보여지도록 제한 한 것.