> brew services start mongodb-community@6.0
> brew services stop mongodb-community@6.0
> brew services
> mongo
> exit
> show dbs
> db
> use databaseName
새로운 DB 생성 또는 기존의 생성된 DB를 사용하는 명령어이다.
DB 생성과 동시에 작업환경을 새 DB로 전환한다.
show dbs로 현재 생성된 DB 리스트를 출력하면, 새로 생성된 DB는 보이지 않는다.
새로 생성된 DB는 비어있는데, 적어도 하나의 컬렉션을 등록해주어야 데이터 목록에 표시된다.
> db.dropDatabase()
> db.stats()
// db.createCollection( name [, options] )
// name 은 Collection 의 이름을 지정하는 인자이고, options 는 Collection 의 설정을 변경해주는 인자
db.createCollection("[collection_name]")
db.createCollection(
"[collection_name]",
{
capped:true,
size:6142800,
max:10000
}
)
Field | Type | 설명 |
---|---|---|
capped | Boolean | boolean타입, true로 설정 시 활성화, capped collection이란 고정된 크기(fixed size)를 가진 컬렉션, 사이즈가 초과시 가장 오래된 데이터를 덮어씀 |
size | number | capped가 true일 경우 필수로 설정 해야되는 값이며, 해당 컬렉션의 최대사이즈(단위:byte) |
max | number | 해당 컬렉션에 추가 할 수 있는 최대 document 갯수 |
> show collections
db.[collection_name].drop()
// test데이터베이스의 book이라는 collection을 제거
// 제거전에는 필수로 use database를 이용하여 현재 데이터베이스를 설정 해야된다.
db.[collection_name].find()
// 다큐먼트를 좀더 깔끔하게 보여준다.
db.[collection_name].find().pretty()
findOne
db.[collection_name].findOne({ name: 'Kane' }); // 단 하나만 찾고 싶을 때 사용. find(...)[0]과도 같다. // find 메소드로 찾은 것 중에 첫 번째 것을 선택
ObjectId
... { "_id" : ObjectId("618ejhsdke8121kf"), "name" : "Son" ... }
- id 필드의 예시)
ObjectId("618ejhsdke8121kf")
는 MongoDB에서 자동으로 넣어주는 고유값.
db.[collection_name].find([query], [projection])
Prameter | Type | 설명 |
---|---|---|
query | document | Optional(선택적). 도큐먼트 조회 기준. 컬렉션 내 모든 문서를 Return하려면 이 매개변수를 생략하거나 빈 문서({})를 전달한다. |
projection | document | Optional. 도큐먼트 조회 시 보여질 field 지정. 모든 필드를 반환하려면 이 매개변수를 생략한다. |
Operator | 설명 |
---|---|
$eq | 지정된 값과 같은 값을 찾는다. |
$gt | 지정된 값보다 큰 값을 찾는다. |
$gte | 지정된 값보다 크거나 같은 값을 찾는다. |
$in | 배열에 속하는 값을 찾는다. |
$lt | 지정된 값보다 작은 값을 찾는다. |
$lte | 지정된 값보다 작거나 같은 값을 찾는다. |
$ne | 지정된 값과 같지 않은 값을 찾는다. |
$nin | 배열에 속하지 않는 값을 찾는다. |
// 비교 연산자
{ 필드: { $eq: 값 } } // 필드 == 값
{ 필드: { $gt: 값 } } // 필드 > 값
{ 필드: { $gte: 값 } } // 필드 >= 값
{ 필드: { $in: [ 값1, 값2, 값3, ... ] } // 필드 == (값1 or 값2 or 값3)
{ 필드: { $lt: 값 } } // 필드 < 값
{ 필드: { $lte: 값 } } // 필드 <= 값
{ 필드: { $ne: 값 } } // 필드 != 값
{ 필드: { $nin: [ 값1, 값2, 값3, ... ] } // 필드 != (값1 and 값2 and 값3)
Operator | 설명 |
---|---|
$and | 두 절의 조건과 일치하는 모든 도큐먼트를 반환한다. |
$not | 조건과 일치하지 않는 도큐먼트를 반환한다. |
$or | 두 절의 조건 중 하나라도 일치하는 도큐먼트를 반환한다. |
$nor | 두 절의 조건과 모두 일치하지 않는 도큐먼트를 반환한다. |
// 논리 연산자
// 조건이 간단하면 그냥 { 필드: 값, 필드: 값 } 이렇게 $and가 없어도 되지만, 여러 논리연산자를 겹쳐 쓸 경우 $and가 필요
// (조건1 or 조건2) and (조건3 or 조건4)
{ $and: [
{ $or: [{ 조건1 }, { 조건2 }] },
{ $or: [{ 조건3 }, { 조건4 }] }
] }
// 조건이 아닌값. $nor의 단일 버전
{ $not: { 조건 } }
// 조건1 or 조건2
{ $or: [ { 조건1 }, { 조건2 }, ... ] }
// 조건1, 조건2 ... 모두 만족하지 않는 다큐먼트
{ $nor: [{ 조건1 }, { 조건2 }, ...] }
// name이 Son 그리고 goal이 23인 다큐먼트. 둘다 일치
db.player.find({
name: 'Son',
goal: 23
}); // 하나의 객체에 두개의 키
// name이 Son 또는 goal이 32.
db.monsters.find({
$or: [
{ name: 'Son' },
{ goal: 32 }
]
}); // 배열에 두개의 객체
db.player.find({
"goal": {$gte:50}
})
// goal >= 50인 document를 조회한다.
db.player.find({
"goal": {$gt:40, $lt:70}
})
// goal이 40 초과 70 미만. 40 < goal < 70
db.player.find({
"name":{
$in:["A","B"]
}
}) // name이 A or B인 Document
db.player.find({
$or:[
{"name":"A"},
{"goal":50}
]
}) // name이 A 혹은 goal이 50인 Document
db.player.find({
$and:[
{"goal":{$lte:50}},
{"name":"B"}
]
}) // (goal < 50) and (name == B)인 Document
db.book.find({"name": {$regex: /a|b/, $options:"i"}})
db.book.find({"name": /a|b/i})
// a또는 b 를 정규식으로 검색 option: i는 대소문자 무시
this
을 써줘야 인식됨db.player.find({
$where: "this.name == 'Son'"
})
// $where을 이용하면 자바스크립트 표현식(expression)을 사용할 수 있다.
// 다음 쿼리를 $where로 간단하게 표현 가능하다.
db.book.find({ $or: [ {name: 'Son'}, {goal: {$lte: 50}} ] })
// ==
db.player.find({ $where: "this.name == 'Son' || this.goal <= 50" })
db.palyer.find()
.sort({"goal":1})
.pretty()
// goal을 오름차순으로 정렬해서 조회
// 1은 오름차순, -1은 내림차순
db.player.find({}, {"_id":false, "name":true, "goal":true});
// 2번째 인자값은 option으로 보여질 Field에 대한 결정을 함
db.player.find( {$and:[{"name":"goal"}]}, {"assist":{$slice:1}} )
// $slice를 하면 해당 갯수만큼의 Document만큼만 갖고온다.
기본적으로 몽고디비의 find( { 내용1 } ) 은 sql의 select from 테이블 where 내용1 과 같다.
즉, find의 첫번째 객체인자는 where로 특정 다큐먼트를 골라 전체를 가져오는것이고
find( { 내용1 }, { 내용2 } ) 두번째 인자가 바로 select 내용2 from 테이블 where 내용1 과 같다고 보면 된다.
어떤걸 select해서 가져와서 민감한 데이터를 감출지 그 역할이다.
즉, MongoDB는 SQL과는 달리 첫째 인자에 where이 오고 둘째 인자에 select 필드가 온다고 보면 된다.
Mongo 3.2버전 이후에는 insertOne(), insertMany() 명령을 사용을 권장하므로, insert() 명령 사용은 자제하는 것이 좋을 것으로 보인다.
db.collection.insert(
<document or array of documents>,
{
writeConcern: [document],
ordered: [boolean]
}
)
Parameter | Type | 설명 |
---|---|---|
document | document or array | collection에 insert할 document 또는 document의 array이다. |
writeConcern | document | Option. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다. 기본 설정을 사용하려면 이 설정을 생략한다. |
ordered | boolean | Option(Defaults: true). true로 설정하면 document array의 인덱스 순으로 insert한다. 처리중 에러가 발생하면 에러가 발생된 document 이후의 처리는 진행되지 않는다. |
insert()
- 단일 또는 다수의 Document를 입력할 때 사용. 만일 컬렉션이 존재하지않는다면 자동으로 생성재주고 insert해준다.
insertOne()
- 단일 Document를 입력할 때 사용
db.[collection_name].insertOne({document})
insertMany()
- 다수의 Documents를 입력할 때 사용db.[collection_name].insertMany([{document}, {document}...])
_id
필드를 지정하지 않으면 MongoDB는 OjbectId 값을 생성해 _id
필드에 추가한다.db.casr.insertOne(
{ item: "santafe", price: 3000, tags: ["suv"], size: { h: 30, w: 100} }
)
// db.casr.find()
[
{
_id: ObjectId("6122fcd6c8fe9037123aa6a6"),
item: 'santafe',
price: 3000,
tags: ['suv'],
size: { h: 30, w: 100 }
}
]
db.[collection_name].update(
[query],
[update],
{
upsert: [boolean],
multi: [boolean],
writeConcern: [document]
})
Parameter | Type | 설명 |
---|---|---|
query | document | update를 위한 selection criteria(기준)이다. find()의 query와 같다. |
update | document | document에 update할 수정 사항이다. |
upsert | boolean | Option(Default: false) true로 설정하면 query criteria에 매칭하는 document가 없을 경우 새로운 document를 insert한다. false로 설정하면 insert하지 않는다. |
multi | boolean | Option(Default: false) true로 설정하면 query criteria에 매칭하는 document 모두를 update한다. false로 설정하면 하나의 document만 update한다. |
writeConcern | document | Option. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다. 기본 설정을 사용하려면 이 설정을 생략한다. |
$set
을 해야 해당 필드만 바뀐다.$set
을 넣지 않고 그냥 { goal: 30 }
하면 다큐먼트의 내용이 다 지워지고 { goal: 30 }
이라는 객체로 통째로 바뀌어버린다.db.player.update({
"goal":110
}, {
$set:{
"goal":120
}
})
// goal:110인걸 검색해서 120으로 업데이트 하라
// update 첫번째인자는 검색 쿼리 key/field, 두번째 인자는 업데이트 쿼리 {$set: {key:field}}
Operator | 설명 |
---|---|
$inc | field의 value를 지정한 수만큼 증가시킨다. |
$rename | field 이름을 rename한다. |
$setOnInsert | update()의 upsert가 true로 설정되었을 경우, document가 insert될 때의 field value를 설정한다. |
$set | update할 field의 value를 설정한다. |
$unset | document에서 설정된 field를 삭제한다 |
$min | 설정값이 field value보다 작은 경우만 update한다 |
$max | 설정값이 field value보다 큰 경우만 update한다. |
$currentDate | 현재 시간을 설정한다 |
db.[collection_name].updateOne([query], [update], {option})
db.[collection_name].updateMany([query], [update], {option})
db.[collection_name].replaceOne([query], [update], {option})
$set
을 안 썼을 때 상황과 유사.
replaceOne()
은 전체 도큐먼트를 대체하고, updateOne()
은 필드를 업데이트하거나 추가할 수 있다는 점에서 차이점이 있다.
replaceOne()
은 전체 도큐먼트를 대체하기 때문에 새 도큐먼트에 포함되지 않은 이전 문서의 필드는 손실된다.
updateOne()
새 필드를 사용하면 이전 문서의 필드를 잃지 않고 추가할 수 있다.
// replaceOne()
replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})
// result
{
"_id" : ObjectId("0123456789abcdef01234567"),
"my_test_key4" : 4.0
}
// updateOne()
updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})
// result
{
"_id" : ObjectId("0123456789abcdef01234567"),
"my_test_key3" : 3333.0,
"my_test_key4" : 4.0
}
update()
와는 달리 upsert(update + insert)과 remove까지 같이 수행. 한 행만 업데이트 한다.Parameter | Type | 설명 |
---|---|---|
query | document | update를 위한 selection criteria(기준)이다. find()의 query와 같다. |
update | document | document에 update할 수정 사항이다. |
new | boolean | 수정 이전의 다큐먼트를 반환할지, 수정 이후의 다큐먼트를 반환할 지 결정하는 부분. { new: true }를 넣으면 수정 이후의 다큐먼트를 반환 |
-디폴트 옵션에서는 두 명령보두 하나의 문서만 변경할 수 있다.
하지만 update 명령은 multi 옵션을 true로 설정해서 여러 문서를 한번에 변경할 수 있다.
db.player.findOneAndUpdate(
{ name: 'Son' },
{ $set: { goal: 15 } },
{ returnNewDocument: true }
);
db.collection.remove(
[query],
{
justOne: [boolean],
writeConcern: [document]
}
)
Parameter | Type | 설명 |
---|---|---|
query | document | deletion criteria(기준)이다. collection 내의 모든 document를 삭제할 경우, {}를 전달한다. |
justOne | boolean | Option(Default: false) true로 설정하면 하나의 document만 삭제한다. 생략하면 deletion criteria에 매칭하는 document 모두를 삭제한다. |
writeConcern | document | Option. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다. 기본 설정을 사용하려면 이 설정을 생략한다. |
db.player.remove()
// 전체를 삭제
db.player.remove({"name":"Son"})
// 해당 Document 리스트를 모두 삭제
deleteOne()
은 매칭되는 첫 번째 다큐먼트만 지움deleteMany()
는 매칭되는 모든 다큐먼트를 지움remove()
메소드를 세분화한 것이다.remove를 deleteOne, deleteMany로 나눈 이유?
예를들어, 댓글 테이블에 삭제 버튼을 누르면 remove 된다고 하면
remove는 기본적으로 다중 삭제 처리라서, 나는 해당 댓글 하나만 삭제하려고 하나의 버튼을 눌렀는데 여러개가 지워질수있다는 위험성을 안고 있다.
물론 Object.id 를 통해 다른 다큐먼트와 관계를 맺어서 지우는거니, 당연히 중복(다중 처리)이 발생할리는 없겠지만, 만일 유니크하지않은 다른 필드로 검색했을때 다중으로 지워질수 있는 실수를 미연에 방지하고, 보다 개발자로 하여금 직관적으로 메서드를 행함을(하나만 처리해라, 여러개 처리해라) 표현하기 위해 api를 추가로 만들었다라고 이해하면 된다.