Search

조회(find), query연산자

대분류
DB
소분류
Mongo
설명
Document 조회 명령어, query연산자
유형
명령어
연산자
주요 레퍼런스
https://velopert.com/479
https://www.mongodb.com/docs/v3.2/reference/operator/query/
최종 편집 일시
2024/10/31 03:29
생성 일시
2024/01/17 01:34
13 more properties

Mock-Up Sample Data

Find

parameter
parameter
Type
설명
query
document
Optional(선택적). 다큐먼트를 조회할 때의 기준. 공란({}) : 기준이 없이 컬렉션에 있는 모든 다큐먼트를 조회
projection
document
Optional. 다큐먼트를 조회할 때 보여질 field를 정합니다.
projection
find, findOne 메소드의 두 번째 인자 - 필터링 기능
민감한 데이터가 있을 경우, 가져올 데이터를 걸러낼 때 사용
불러올 용량이 줄어듦
SQL과의 비교 find({ 내용1 }) = select * from table where 내용1 find({ 내용1 }, { 내용2 }) = select 내용2 from table where 내용1 parameter = where, projection = select
반환(return) 값 : cursor
cursor : query 요청의 결과값을 가르키는 pointer cursor 객체를 통하여 보이는 데이터의 수 제한 및 정렬 가능. 10분동안 사용되지 않으면 만료.

find()

db.COLLECTION_NAME.find(query, projection)
모든 다큐먼트 조회
> db.articles.find() { "_id" : ObjectId("56c0ab6c639be5292edab0c4"), "title" : "article01", "content" : "content01", "writer" : "Velopert", "li { "_id" : ObjectId("56c0ab6c639be5292edab0c5"), "title" : "article02", "content" : "content02", "writer" : "Alpha", "likes { "_id" : ObjectId("56c0ab6c639be5292edab0c6"), "title" : "article03", "content" : "content03", "writer" : "Bravo", "likes ] }
Shell
복사

pretty()

db.COLLECTION_NAME.find().pretty()
다큐먼트를 깔끔하게 조회
> db.articles.find().pretty() { "_id" : ObjectId("56c0ab6c639be5292edab0c4"), "title" : "article01", "content" : "content01", "writer" : "Velopert", "likes" : 0, "comments" : [ ] }
Shell
복사

sort()

db.COLLECTION_NAME.find().sort({”Key” : -1 | 1})
해당 Key의 Value를 기준으로 정렬
오름차순 1
내림차순 -1

limit()

db.COLLECTION_NAME.find().limit(number)
number 갯수만 출력
db.book.find().limit(2) # 2개만 출력한다
Shell
복사

skip()

db.COLLECTION_NAME.find().skip(number)
=== MySQL Offset
db.book.find().skip(2) # 리스트에서 2개를 skip후 Document를 출력 # 원래 총 3개 조회된다면, 2개를 스킾하고 마지막 1개만 출력
Shell
복사

예제 1 :

db.COLLECTION_NAME.find( { “Key” : “Value” } ).pretty()
Key값이 “Value” 인 Document 조회
> db.articles.find({"writer": "Velopert"}).pretty() { "_id" : ObjectId("56c0ab6c639be5292edab0c4"), "title" : "article01", "content" : "content01", "writer" : "Velopert", "likes" : 0, "comments" : [ ] }
Shell
복사

예제 2 :

db.COLLECTION_NAME.find( { “Key”: { Query Operator ex)$gt: 10, $lt: 30 } } ).pretty()
Key값이 Value(query 연산자의 조건에 부합하는)인 Document 조회

Query

비교(Comparison), 논리(Logical), 요소(Element), 배열(Array) 등

비교 연산자

operator
설명
$eq
(equals) 주어진 값과 일치하는 값
$gt
(greater than) 주어진 값보다 큰 값
$gte
(greather than or equals) 주어진 값보다 크거나 같은 값
$lt
(less than) 주어진 값보다 작은 값
$lte
(less than or equals) 주어진 값보다 작거나 같은 값
$ne
(not equal) 주어진 값과 일치하지 않는 값
$in
주어진 배열 안에 속하는 값
$nin
주어빈 배열 안에 속하지 않는 값
{ 필드: { $gt:} } // 필드 > 값 { 필드: { $lt:} } // 필드 < 값 { 필드: { $gte:} } // 필드 >= 값 { 필드: { $lte:} } // 필드 <= 값 { 필드: { $eq:} } // 필드 == 값 { 필드: { $ne:} } // 필드 != 값 { 필드: { $in: [1,2,3, ... ] } // 필드 == (값1 or 값2 or 값3) { 필드: { $nin: [1,2,3, ... ] } // 필드 != (값1 and 값2 and 값3)
JavaScript
복사

논리 연산자

operator
설명
$or
주어진 조건중 하나라도 true 일 때 true
$and
주어진 모든 조건이 true 일 때 true
$not
주어진 조건이 false 일 때 true
$nor
주어진 모든 조건이 false 일때 true
// 조건1 or 조건2 { $or: [ { 조건1 }, { 조건2 }, ... ] } // 조건이 간단하면 그냥 { 필드: 값, 필드: 값 } 이렇게 $and가 없어도 되지만, 여러 논리연산자를 겹쳐 쓸 경우 $and가 필요합니다. // (조건1 or 조건2) and (조건3 or 조건4) { $and: [ { $or: [{ 조건1 }, { 조건2 }] }, { $or: [{ 조건3 }, { 조건4 }] } ] } // 조건1, 조건2 ... 모두 만족하지 않는 다큐먼트 { $nor: [{ 조건1 }, { 조건2 }, ...] } // 조건이 아닌값. $nor의 단일 버전 { $not: { 조건 } }
JavaScript
복사

$regex 연산자 (정규식)

{ <field>: { $regex: /pattern/, $options: '<options>' } } { <field>: { $regex: 'pattern', $options: '<options>' } } { <field>: { $regex: /pattern/<options> } } { <field>: /pattern/<options> }
JavaScript
복사
option
설명
i
대소문자 무시
m
정규식에서 anchor(^) 를 사용 할 때 값에 \n 이 있다면 무력화
x
정규식 안에있는 whitespace를 모두 무시
s
dot (.) 사용 할 떄 \n 을 포함해서 매치
# 정규식 article0[1-2] 에 일치하는 값이 title 에 있는 Document 조회 > db.articles.find( { "title" : /article0[1-2]/ } ) > db.articles.find({"name": {$regex: /a|b/, $options:"i"}}) > db.articles.find({"name": /a|b/i}).pretty() { "_id" : ObjectId("56c0ab6c639be5292edab0c4"), "title" : "article01", "content" : "content01", "writer" : "Velopert", "likes" : 0, "comments" : [ ] } { "_id" : ObjectId("56c0ab6c639be5292edab0c5"), "title" : "article02", "content" : "content02", "writer" : "Alpha", "likes" : 23, "comments" : [ { "name" : "Bravo", "message" : "Hey Man!" } ] }
Shell
복사

$where 연산자

javascript 문법 사용
this를 사용하여 인식 가능
# comments field 가 비어있는 Document 조회 > db.articles.find( { $where: "this.comments.length == 0" } ) db.book.find({ $or: [ {name: 'A'}, {hits: {$lte: 50}} ] }) # == db.book.find({ $where: "this.name == 'A' || this.hits <= 50" }) { "_id" : ObjectId("56c0ab6c639be5292edab0c4"), "title" : "article01", "content" : "content01", "writer" : "Velopert", "likes" : 0, "comments" : [ ]
Shell
복사

Embedded / Array / Object 검색

Embedded : $elemMatch

조건이 배열 안의 요소와 일치하는 필드를 선택
Embedded Documents : auther Field처럼 Document 안배열 형태로 있는 Document
mock-up data에서는 comments 가 Embedded Document에 속함.
# comments 중 “Charlie” 가 작성한 덧글이 있는 Document 조회 > db.articles.find( { "comments": { $elemMatch: { "name": "Charlie" } } } ) { "_id" : ObjectId("56c0ab6c639be5292edab0c6"), "title" : "article03", "content" : "content03", "writer" : "Bravo", "likes" : 40, "comments" : [ { "name" : "Charlie", "message" : "Hey Man!" }, { "name" : "Delta", "message" : "Hey Man!" } ] }
Shell
복사

Array : 바로 접근 ($all, $size)

db.book.find({"language":"eng"}) # Embedded Document가 아니고 일반 배열일 경우 바로 접근하면 된다.
Shell
복사
$all
$all 쿼리 안에 있는 모든 값을 포함하는 배열을 값으로 가진 태그 선택
아래의 배열이 예에서 값1, 값2 등등 모든 값을 가지고 있어야 함.
db.book.find({language: {$all: ['eng', 'kor']}}) # language배열이 'eng', 'kor' 원소 모두 가지고 있을 경우
Shell
복사
$size
배열의 length가 값과 일치하는 필드 선택
db.book.find({language: { $size:3 }})
Shell
복사

Object : 내부 속성 접근 (.)

객체 내부에 접근하듯 .으로 내부 속성을 지목
따옴표로 묶어줘야 에러 발생X
db.book.find("seller.name":"saramin") # Embedded Document가 아니고 Key/Field일 경우도 .형태로 접근 가능
Shell
복사