# 1. admin db로 접속
> use admin
switched to db admin
# 2. 현재 db 확인
> db
admin
# 3. admin 계정 생성
> db.createUser({
user: "jina",
pwd: "0418",
roles: ["readWrite", "dbAdmin"]
});
Successfully added user: { "user" : "jina", "roles" : [ "readWrite", "dbAdmin" ] }
해당 db 또는 admin으로 이동 후 아래의 명령어 이용하여 계정 삭제
db.dropUser("계정이름")
use 명령어를 이용하여 db 생성
만약, 이미 존재하는 데이터베이스명일 경우, 그 데이터 베이스로 이동
use 데이터베이스명
db
: 현재 사용중인 데이터베이스 확인show dbs
: 데이터베이스 리스트 확인db.stats()
: 데이터베이스 상태확인db.dropDatabase()
db.createCollection(name, [options])
컬렉션 리스트를 조회한다
show collections
db.컬렉션명.drop()
insert 와 save 가 있음
# 단일 document 추가
db.컬렉션명.insert(
{
"name": "jina",
"pwd": "1234"
}
)
# 배열 형식으로 복수 document 추가
db.컬렉션명.insert({
{
"name":"2cong",
"pwd":"5678"
}, {
"name":"dana",
"pwd":"7890"
}
})
db.컬렉션명.save({
'키' : '값'
});
db.컬렉션이름.find({
<field1>: { <operator1>: <value1> },
...
}, projection)
중첩필드의 경우
javascript 체이닝처럼 중첩필드 사용
배열에 관해서도
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
처럼 0같이 배열의 index로 접근하면됨
# 데이터
{ size: { h: 14, w: 21, uom: "cm" } }
# 중첩쿼리에 대한 find
db.inventory.find( { "size.uom": "in" } )
db.inventory.find( { "size.h": { $lt: 15 } } )
projection을 통한 반환할 필드 지정
반환할 필드 : 1 을 지정하여, 쿼리와 일치하는 모두 문서를 반환
_id 는 지정해주지 않으면 default 1 로 지정되어 있어서 항상 출력됨( _id
: 0 으로 지정해서 지울수 있음)
반대로 , 반환할 필드 나열 대신, 특정 필드 제외할 수 있음
반환하지않을 필드 : 0 을 지정
# 데이터
{ item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
{ item: "notebook", status: "A", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
{ item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
{ item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
# 반환할 필드 지정 쿼리
db.inventory.find( { status: "A" }, { item: 1, status: 1 } ) # _id, item, status 필드 출력
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } ) # item, status 필드 출력
db.inventory.find(
{ status: "A" },
{ item: 1, status: 1, "size.uom": 1 }
) # size.uom을 통해 size 내 중첩필드에 관한 필드 출력 지정
db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )
# instock: { $slice: -1 } 를 통해 instock의 마지막 요소 반환
# 배열에 관해서는 instock.0 : 1 을 사용할 수 없기 때문에, $slice 를 통해서 하여야한다.
# 특정 필드 제외 항목 반환
db.inventory.find( { status: "A" }, { status: 0, instock: 0 } ) # status 와 instock 필드 제외
sort()
: 정렬# sort 사용예시
> db.orders.find().sort( { "amount": 1, "_id": -1 } )
{ "_id" : 6, "item" : { "category" : "brownies", "type" : "blondie" }, "amount" : 10 }
{ "_id" : 1, "item" : { "category" : "cake", "type" : "chiffon" }, "amount" : 10 }
{ "_id" : 3, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 15 }
{ "_id" : 5, "item" : { "category" : "cake", "type" : "carrot" }, "amount" : 20 }
{ "_id" : 4, "item" : { "category" : "cake", "type" : "lemon" }, "amount" : 30 }
{ "_id" : 2, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 50 }
limit()
: 출력물 갯수 제한# limit 사용예시
> db.orders.find().limit(3)
{ "_id" : 1, "item" : { "category" : "cake", "type" : "chiffon" }, "amount" : 10 }
{ "_id" : 2, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 50 }
{ "_id" : 3, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 15 }
skip()
: 출력할 데이터 시작부분 설정# skip 사용예시
> db.orders.find().skip(2)
{ "_id" : 3, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 15 }
{ "_id" : 4, "item" : { "category" : "cake", "type" : "lemon" }, "amount" : 30 }
{ "_id" : 5, "item" : { "category" : "cake", "type" : "carrot" }, "amount" : 20 }
{ "_id" : 6, "item" : { "category" : "brownies", "type" : "blondie" }, "amount" : 10 }
update 와 save가 있다.
db.컬렉션명.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
Parameter | Type | 설명 |
---|---|---|
*query | document | 업데이트 할 document의 criteria 를 정합니다. find() 메소드 에서 사용하는 query 와 같습니다. |
*update | document | document에 적용할 변동사항입니다. |
upsert | boolean | Optional. (기본값: false) 이 값이 true 로 설정되면 query한 document가 없을 경우, 새로운 document를 추가합니다. |
multi | boolean | Optional. (기본값: false) 이 값이 true 로 설정되면, 여러개의 document 를 수정합니다. |
writeConcern | document | Optional. wtimeout 등 document 업데이트 할 때 필요한 설정값입니다. 기본 writeConcern을 사용하려면 이 파라미터를 생략하세요. 자세한 내용은 매뉴얼을 참조해주세요. |
db.컬렉션명.save({
'키' : '값'
});
1. 특정 field 업데이트
특정 field의 값을 수정할 땐 $set 연산자
를 사용합니다. 이 연산자를 사용해서 똑같은 방법을 새로운 field를 추가 할 수도 있습니다.
# Abet document 의 age를 20으로 변경한다
> db.people.update( { name: "Abet" }, { $set: { age: 20 } } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
2. document를 replace 하기
이렇게 새로운 document 로 replace 할 때, _id는 바뀌지 않습니다.
# Betty document를 새로운 document로 대체한다.
> db.people.update( { name: "Betty" }, { "name": "Betty 2nd", age: 1 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
3. 특정 field를 제거하기
여기서 score: 1 의 1 은 true 의 의미입니다.
# David document의 score field를 제거한다
> db.people.update( { name: "David" }, { $unset: { score: 1 } } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
4. criteria에 해당되는 document가 존재하지 않는다면 새로 추가하기
# upsert 옵션을 설정하여 Elly document가 존재하지 않으면 새로 추가
> db.people.update( { name: "Elly" }, { name: "Elly", age: 17 }, { upsert: true } )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("56c893ffc694e4e7c8594240")
})
5. 여러 document의 특정 field를 수정하기
# age가 20 보다 낮거나 같은 document의 score를 10으로 설정
> db.people.update(
{ age: { $lte: 20 } },
{ $set: { score: 10 } },
{ multi: true }
)
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 0 })
6-1. 배열 에 값 추가하기
push 명령어를 사용하여 배열 값에 추가
# Charlie document의 skills 배열에 "angularjs" 추가
> db.people.update(
{ name: "Charlie" },
{ $push: { skills: "angularjs" } }
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
6-2. 배열 에 값에 여러개 추가하기 + 오름차순 정렬
$sort 값을 내림차순으로 정렬하려면 -1 로 하면 됩니다.
배열이 document의 배열이고 그 embedded document의 특정 field에 따라서 정렬을 할 때는 이렇게 사용
$sort: { KEY: 1 }
# Charlie document의 skills에 "c++" 와 "java" 를 추가하고 알파벳순으로 정렬
> db.people.update(
{ name: "Charlie" },
{ $push: {
skills: {
$each: [ "c++", "java" ],
$sort: 1
}
}
}
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
7-1. 배열에 값 제거하기
# Charlie document에서 skills 값의 mongodb 제거
> db.people.update(
{ name: "Charlie" },
{ $pull: { skills: "mongodb" } }
)
7-2. 배열 에 값 추가하기
# Charlie document에서 skills 배열 중 "angularjs" 와 "java" 제거
> db.people.update(
{ name: "Charlie" },
{ $pull: { skills: { $in: ["angularjs", "java" ] } } }
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.컬렉션이름.remove({
'키' : '값'
})
$eq : (equals) 주어진 값과 일치하는 값
$gt : (greater than) 주어진 값보다 큰 값
$gte : (greather than or equals) 주어진 값보다 크거나 같은 값
$lt : (less than) 주어진 값보다 작은 값
$lte : (less than or equals) 주어진 값보다 작거나 같은 값
$ne : (not equal) 주어진 값과 일치하지 않는 값
$in : 주어진 배열 안에 속하는 값
$nin : 주어빈 배열 안에 속하지 않는 값
# 비교 연산자 사용 예시
db.articles.find( { “likes”: { $gt: 10, $lt: 30 } } )
# 논리 연산자 사용 예시
db.articles.find({ $or: [ { “title”: “article01” }, { “writer”: “Alpha” } ] })
{ <field>: /pattern/<options> }
이런 형태로 정규표현식으로 쿼리를 날릴 수 있다.
options 에는 다음과 같은 것들을 쓸 수 있다.
# regex 사용 예시
db.articles.find( { "title" : /article0[1-2]/ } )
$where 연산자를 통하여 javascript expression 을 사용 할 수 있다.
# $where
db.articles.find( { $where: “this.comments.length == 0” } )
$elemMatch 와 $slice 가 있다
# 주어진 자료 형태
{ _id: 1, results: [ 82, 85, 88 ] }
{ _id: 2, results: [ 75, 88, 89 ] }
# $elemMatch 사용예시
db.scores.find(
{ results: { $elemMatch: { $gte: 80, $lt: 85 } } }
)
# index 하나에 대해
db.collection.find(
<query>,
{ <arrayField>: { $slice: <number> } }
);
# index 여러개에 대해
db.collection.find(
<query>,
{ <arrayField>: { $slice: [ <number>, <number> ] } }
);
모든 MongoDB의 컬렉션은 기본적으로 _id 필드에 인덱스가 존재한다.
만약에 컬렉션을 만들 때 _id 필드를 따로 지정하지 않으면 mongod 드라이버가 자동으로 _id 필드 값을 ObjectId로 설정해준다.
Single Field Index : 기본적인 인덱스 타입, 설정안하면 default로 _id
Compound Index : RDBMS의 복합인덱스 같은 거, 2개이상 필드를 인덱스로 사용
Multikey Index : Array에 매칭되는 값이 하나라도 있으면 인덱스에 추가하는 멀티키 인덱스
Geospatial Index : 위치기반 인덱스와 쿼리(지도의 좌표와 같은 데이터를 효율적으로 쿼리하기 위해서
(예: 특정 좌표 반경 x 에 해당되는 데이터를 찾을 때 사용)
Text Index : String에도 인덱싱이 가능
(예: 텍스트 관련 데이터를 효율적으로 쿼리)
Hashed Index : Btree 인덱스가 아닌 Hash 타입의 인덱스도 사용 가능. Hash는 검색 효율이 B Tree보다 좋지만, 정렬을 하지 않음
db.컬렉션명.createIndex(document[, options])
로 인덱스를 생성한다.
document에는 { Key : Value }
형식으로 넣어주면 되고, value가 1이면 오름차순, -1이면 내림차순이다.
options 객체에는 다음과 같은 속성들이 있다.
db.userinfo.createIndex( { email: 1 }, { unique: true } )
)db.store.createIndex( { name: 1 }, { partialFilterExpression: { visitors: { $gt: 1000 } } })
)db.notifications.createIndex( { "notifiedDate": 1 }, { expireAfterSeconds: 3600 } )
)db.컬렉션명.getIndexes()
로 생성된 인덱스를 확인할 수 있다.
db.컬렉션명.dropIndex(document)
로 제거한다
>db.user.find({score:"23"}).explain("executionStats").executionStats.executionTimeMillis
764
> db.user.createIndex({score:1})
> db.user.find({score:"56"}).explain("executionStats").executionStats.executionTimeMillis
0
> db.[컬렉션 명].ensureindex({"필드":1},{background:true})