MongoDB - find()

민지킴·2021년 4월 27일
0

Document 를 조회하는 find() 메소드

find() 메소드의 표현식

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()

— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -

Query 연산자

find() 메소드를 사용할 때 비교나 정규표현식 등을 사용할 때는 Query 연산자를 사용합니다.
Query 연산자의 종류는 비교(Comparison), 논리(Logical), 요소(Element), 배열(Array) 등이 있습니다.

operator 설명

eq(equals)주어진값과일치하는값eq (equals) 주어진 값과 일치하는 값gt (greater than) 주어진 값보다 큰 값
gte(greaterthanorequals)주어진값보다크거나같은값gte (greater than or equals) 주어진 값보다 크거나 같은 값lt (less than) 주어진 값보다 작은 값
lte(lessthenorequals)주어진값보다작거나같은값lte (less then or equals) 주어진 값보다 작거나 같은 값ne (not equlas) 주어진 값과 일치하지 않는 값
in(in)주어진배열안에속하는값in (in) 주어진 배열 안에 속하는 값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()

— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -

- 논리(Logical) 연산자

논리 연산자의 종류는 다음과 같습니다.
*논리 연산자의 조건이 여러개 일 경우, 조건들을 배열안에 넣습니다.

Operator 설명
or주어진조건중하나라도만족한다면trueor 주어진 조건 중 하나라도 만족한다면 trueand 주어진 조건을 모두 만족해야만 true
not주어진조건이거짓일때truenot 주어진 조건이 거짓일 때 truenor 주어진 모든 조건이 거짓일 때 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 연산자

regex연산자를통하여Document를검색할때정규표현식을이용할수있습니다.regex 연산자를 통하여 Document 를 검색할 때 정규표현식을 이용할 수 있습니다.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까지의 문자 한 개. 

— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -

- $where 연산자

MongoDB 는 자바스크립트 기반이기 때문에 $where 연산자를 통하여 javascript expression 을 사용할 수 있습니다.

commnets 필드가 비어있는 다큐먼틀을 조회하려면 다음과 같이 명령어를 입력합니다.
db.articles.find( { $where : "this.comments.length === 0" } ).pretty()

$where 연산자의 값은 문자열로 입력합니다. (문자열로 자바스크립트 표현식을 사용)
this 는 article 안에 있는 document 들을 의미

— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -

- $elemMatch 연산자

$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"})

— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -
— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -

- projection

이제 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 로 지정해 주어야 한다.

— — — — — — — — — — — — — — — — — — — — — — — —— — —— — — — — - - - -

- $slice 연산자

projection 의 $slice 연산자는 Embeded Document 배열을 불러올 때 갯수를 제한하는 역할을 합니다.

title 이 "article03" 인 도큐먼트의 덧글을 1개만 보이도록 조회
db.articles.find( { title : "article03" }, { comments : { $slice : 1 } } )
*원래 title 이 "article03" 인 도큐먼트의 덧글은 2개 이지만 projection 을 통해 한개만 보여지도록 제한 한 것.

profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글