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
복사