Mongo DB 기본 쿼리 정리
사용할 데이터 베이스 선택
use 데이터베이스이름
현재 사용중인 데이터 베이스 이름 확인
db
데이터 베이스 리스트 확인
show dbs
사용중인 데이터 베이스 DROP 하기
db.dropDatabase()
컬렉션 생성
db.createCollection("컬렉션이름",{옵션})
// 옵션에는 {capped : true / false, size : 10000, max : 1000}
// size 는 컬렉션의 크기(byte단위) 제한
// max 는 컬렉션의 개수 제한
컬렉션이 capped 인지 아닌지 확인
db.컬렉션이름.isCapped()
이미 생성된 컬렉션을 Capped 컬렉션으로 변경
db.runCommand({"convertToCapped":"컬렉션이름",size:10000})
도큐먼트 삽입 1
db.컬렉션이름.insert({필드명:"필드값"})
도큐먼트 삽입 2
db.컬렉션이름.insert(
{
필드명 1: "데이터" // 문자
필드명 2: 17 // 숫자
필드명 3: ["원소1", "원소2"] // 배열
}
)
도큐먼트 삽입 3 - 임베이드 도큐먼트 : 도큐먼트 안에 배열 형태로 여러 도큐먼트를 또 넣을 수 있다.
db.컬렉션이름.insert(
{
필드명 1 : "필드값"
필드명 2 : [ // 배열 형태로 삽입된다
{
필드명2-1-1 : "필드값",
필드명2-1-2 : "필드값"
},
{
필드명2-2-1 : "필드값",
필드명2-2-1 : "필드값"
}
]
}
)
도큐먼트 삽입 4 - insertMany()
db.컬렉션이름.insertMany( // 배열형태로 한번에 여러 도큐먼트를 넣을 수 있다.
[
{_id1, 필드명: "필드값", 필드명2: "필드값", 필드명3: 13},
{_id2, 필드명: "필드값", 필드명2: "필드값", 필드명3: 14},
{_id3, 필드명: "필드값", 필드명2: "필드값", 필드명3: 15},
]
)
도큐먼트 입력 검증
db.createCollection("컬렉션이름",
{
validator: {
필드명1: {$type: "string"}, // string, boolean, array, int 등 데이터형 옵션
필드명2: {$in:["Seoul", "Cheongju"]} // 순서 상관 없음. 배열의 원소들안에서 데이터 제한.
}
}
)
도큐먼트 검색
db.컬렉션이름.find().pretty()
도큐먼트 검색 : Projection
db.컬렉션이름.find({필드명: "필드값", 필드명2: "필드값"}, {"필드명" : 1}) // 뒤에 0이면 해당 필드값을 숨기고 1이면 보여줌
*db.컬렉션이름.find({}),{필드명: 1, 필드명2 :0}) 다음과 같은 옵션을 불가능. 필드명 여러개 혼합 불가.
숨길것만 0 Flag. 플래그 없는건 무조건 표기.
도큐먼트 검색 : Query Operator (쿼리 연산자)
db.컬렉션이름.find({필드명:{$쿼리연산자:조건값}})
//$eq = equal
//$gt = greater than
//$gte = greater equal
//$lt = less than
//$lte = less equal
//$ne = not equal
db.컬렉션이름.find({필드명:{$쿼리연산자["필드값", "필드값"]}) // 순서 Sensitive X
//$in = 배열에 해당 값이 있는지 (있으면 보여줌)
//$nin = 배열에 해당 값이 없는지 (없으면 보여줌)
ex) [1,2,3,4,5]를 조건으로 검색했을때
$in[1,2,6] 해도 나옴 즉, OR 검색이다.
도큐먼트 검색 : Logical Operator (논리 연산자)
db.컬렉션이름.find({$논리연산자: [{필드명: "필드값"}, {필드명2:"필드값"}]})
db.컬렉션이름.find({$논리연산자: [{필드명: "필드값"}, {필드명2: {$쿼리연산자: 조건값}}]})
//$and
//$not
//$nor
//$or
도큐먼트 검색 : 임베디드 도큐먼트 접근
db.컬렉션이름.find({필드명: {필드명1: "필드값", 필드명2: "필드값", 필드명3: "필드값"}})
db.컬렉션이름.find({"필드명.필드명1": "필드값", "필드명.필드명2": "필드값"})
//위와 같이 검색시 전체가 완전히 같은 결과만 보여줌 (AND 연산 검색)
db.컬렉션이름.find({필드명: {$elemMatch: {"임베디드필드명": "필드값"}}})
//위와 같이 검색시 도큐먼트 안에 해당값이 포함되는 결과값 보여줌 (OR 연산 검색)
도큐먼트 검색 : 배열 원소 접근
db.컬렉션이름.find({필드명: ["배열원소1", "배열원소2"]})
// 배열에 순서, 갯수 정확히 일치하는 결과만 보여줌
db.컬렉션이름.find({필드명: {$all: ["배열원소1", "배열원소2"]}})
// 배열에 포함만 되면 다 보여줌 (OR 연산 검색)
// *인덱스 값으로 접근시 0 베이스 인덱싱임으로 주의할것
db.컬렉션이름.find({필드명: {$elemMatch : {$gt:80, $lt:90}}})
// 임베디드 도큐먼트 뿐만 아니라 쿼리연산자를 활용하여 배열에도 사용 가능
도큐먼트 검색 : 배열 길이를 통한 접근
db.컬렉션이름.find({"필드명": {$size: n}}) //원소의 개수가 n 개인 배열 검색
db.컬렉션이름.find({"필드명": {$size {$쿼리연산자 : n}}}) //쿼리 연산자 또한 사용가능
db.컬렉션이름.find({$where: "this.필드명.length > n"}) //자바스크립트 조건문검색의 형태도 사용가능
도큐먼트 검색 : null 값
db.컬렉션이름.find({"필드명": null}) //null값을 갖는 필드 찾기
db.컬렉션이름.find({"필드명": {$ne:null}}) //null 값이 아닌 필드 찾기
도큐먼트 검색 : 존재 여부
db.컬렉션이름.find({"필드명": {$exists: true/false}}) // 해당 필드명이 있는 문서가 있는지 없는지 *exists "s" 안붙이는 실수 자주함
도큐먼트 검색 : regex
db.컬렉션이름.find({"필드명": {$regex: "XX"}}) //필드값에 XX 를 포함하는 문서를 검색. 대소문자 구분.
db.컬렉션이름.find({"필드명": {$regex: "XX", options: 'i'}}) //대소문자 구분 X
db.컬렉션이름.find({"필드명": {$regex: "^XX"}}) //첫자리가 XX 인것 찾기
db.컬렉션이름.find({"필드명": {$regex: "XX$"}}) //끝자리가 XX 인것 찾기
db.컬렉션이름.find({"필드명": {$regex: "^XX$"}}) //딱 XX인것 찾기
도큐먼트 수정 - update 수정 : 필드단위 수정
db.컬렉션이름.update({필드명: "필드값"}, {$set: {필드명: "수정할필드값"}}) //하나만 수정됨
db.컬렉션이름.update({필드명: "필드값"}, {$set: {필드명: "수정할필드값"}}, {multi: true}) //전부 수정됨
*주의 : update 할 필드명과, 수정될 필드명이 달라지면 set에 설정한 필드명과 필드값으로 새롭게 추가된다.
도큐먼트 수정 - save : 덮어쓰기 - 필드 갯수도 달라질때
db.컬렉션이름.save({필드명: "필드값", 필드명2: "필드값", 필드명3: "필드값"})
도큐먼트 삭제
db.컬렉션이름.remove({}) //전체 삭제
db.컬렉션이름.remove({필드명 : '필드값'}, 1) //해당 필드값을 가지는 레코드 하나만 삭제
db.컬렉션이름.remove({필드명 : '필드값'}) //해당 필드값을 가지는 레코드 전부 삭제
Aggregation Framework
db.컬렉션이름.aggregate(
[
{$match: {}},
{$sort: {}},
{$project: {}},
{$limit: {}},
{$skip: {}},
{$group: {_id: "$그룹명으로 만들 필드명"}},
{$count: {}},
{$unwind {}},
{$out: {}},
]
)
//다음과 같은 함수 연산자 사용 가능
//$max
//$min
//$avg
//$sum
//$addToSet
//$push
//$first
//$last
인덱싱 : 몽고디비는 기본적으로 _id 필드 인덱싱으로 한다 (_id 필드는 독립된 데이터 type을 가진다)
db.컬렉션이름.createindex({"필드명" : -1 or 1}) //1은 오름차순 인덱싱, -1은 내림차순 인덱싱
db.컬렉션이름.createinder({"필드명" : 1, "필드명2": -1}) //여러개의 필드에 대해 인덱싱도 가능
explain() : 쿼리문의 수행 내역을 출력
쿼리문 뒤에 .explain("executionStats")