[MongoDB] 명령어

유동균·2023년 1월 28일
0

MongoDB

목록 보기
4/12
post-thumbnail

명령어

1. 서버 명령어

1.1. 서버 실행

> brew services start mongodb-community@6.0

1.2. 서버 종료

> brew services stop mongodb-community@6.0

서버 실행 확인

> brew services

1.3. MongoDB 쉘 실행

> mongo

1.4. MongoDB 쉘 종료

> exit

2. DB관련 명령어

2.1. 생성된 DB 리스트 조회

> show dbs

2.2. 현재 사용하고 있는 DB 보기

> db

2.3. DB 생성 및 선택

> use databaseName

새로운 DB 생성 또는 기존의 생성된 DB를 사용하는 명령어이다.
DB 생성과 동시에 작업환경을 새 DB로 전환한다.
show dbs로 현재 생성된 DB 리스트를 출력하면, 새로 생성된 DB는 보이지 않는다.
새로 생성된 DB는 비어있는데, 적어도 하나의 컬렉션을 등록해주어야 데이터 목록에 표시된다.

2.4. DB 삭제

> db.dropDatabase()
  • 현재 사용 중인 DB를 삭제

2.5. 현재 사용 하고 있는 데이터 베이스 정보 출력

> db.stats()

3. 컬렉션 관련 명령어

3.1. 컬렉션 생성

// db.createCollection( name [, options] )
// name 은 Collection 의 이름을 지정하는 인자이고, options 는 Collection 의 설정을 변경해주는 인자

db.createCollection("[collection_name]")

db.createCollection(
    "[collection_name]",
    {
        capped:true, 
        size:6142800, 
        max:10000
    }
)
  • createCollection options
FieldType설명
cappedBooleanboolean타입, true로 설정 시 활성화,
capped collection이란 고정된 크기(fixed size)를 가진 컬렉션, 사이즈가 초과시 가장 오래된 데이터를 덮어씀
sizenumbercapped가 true일 경우 필수로 설정 해야되는 값이며, 해당 컬렉션의 최대사이즈(단위:byte)
maxnumber해당 컬렉션에 추가 할 수 있는 최대 document 갯수

3.2. 컬렉션(테이블) 조회

> show collections
  • 현재 사용중인 DB에 있는 컬렉션을 조회

3.3. 컬렉션 삭제

db.[collection_name].drop()
// test데이터베이스의 book이라는 collection을 제거
// 제거전에는 필수로 use database를 이용하여 현재 데이터베이스를 설정 해야된다.

4. 도큐먼트 명령어

4.1. Read 모든 도큐먼트 조회

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에서 자동으로 넣어주는 고유값.

4.2. 특정 도큐먼트 조회

db.[collection_name].find([query], [projection])
PrameterType설명
querydocumentOptional(선택적). 도큐먼트 조회 기준.
컬렉션 내 모든 문서를 Return하려면 이 매개변수를 생략하거나 빈 문서({})를 전달한다.
projectiondocumentOptional. 도큐먼트 조회 시 보여질 field 지정. 모든 필드를 반환하려면 이 매개변수를 생략한다.
  • Return(반환) : 기준과 일치하는 문서에 대한 커서(cursor)이다. find() 메서드가 문서를 반환할 때 메서드는 실제로 문서에 커서를 반환한다.
  • 커서 : query 결과값을 가리키는 포인터
  • 연산자(Query Selectors) : 도큐먼트 조회 시 여러가지 연산자를 이용해 조회 조건을 줄 수 있다.

Link : MongoDB Qperators

4.2.1. 비교연산자(Comparison)

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)

4.2.2. 논리연산자(Logical)

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

정규표현식($regex)

db.book.find({"name": {$regex: /a|b/, $options:"i"}})
db.book.find({"name": /a|b/i})
// a또는 b 를 정규식으로 검색 option: i는 대소문자 무시

조건($where)

  • 자바스크립트 문법을 이용해 검색할 수 있다
  • 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" })

정렬(sort)

db.palyer.find()
	.sort({"goal":1})
    .pretty()
// goal을 오름차순으로 정렬해서 조회
// 1은 오름차순, -1은 내림차순

4.2.3. 선택 필드 Projection

  • projection이란 find와 findOne 메소드의 두 번째 인자
  • 결과로 보여줄 것만 필터링하는 기능
  • projection이 유용한 경우는 민감한 데이터가 있을 경우.
    만약 댓글을 단 회원의 정보를 가져오고 싶은데 회원 정보를 통째로 가져오면 비밀번호나 개인 정보같은 게 모두 가져와지는데, 그럴 때 projection 객체를 사용해서 가져올 데이터만 걸러내는 것이다.
  • 또한 한 가지 더 장점은 용량이 줄어드는 것이다.
    게시글 리스트에서 게시글들을 모두 불러오면 용량이 어마어마하다.
    게시글 제목, 내용, 댓글까지 다 불러와지기 때문에, 이럴 때 제목만 불러오도록 하면 데이터를 아낄 수 있다.
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 필드가 온다고 보면 된다.

4.3. Create 데이터 삽입

Mongo 3.2버전 이후에는 insertOne(), insertMany() 명령을 사용을 권장하므로, insert() 명령 사용은 자제하는 것이 좋을 것으로 보인다.

db.collection.insert(
  <document or array of documents>,
  {
    writeConcern: [document],
    ordered: [boolean]
  }
)
ParameterType설명
documentdocument or arraycollection에 insert할 document 또는 document의 array이다.
writeConcerndocumentOption. database에 write(insert, update, remove) 처리를
영속화시키기 위한 설정이다. 기본 설정을 사용하려면 이 설정을 생략한다.
orderedbooleanOption(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 }
    }
]

4.4. Update 도큐먼트 업데이트

db.[collection_name].update(
  [query], 
  [update], 
  {
  	upsert: [boolean],
    multi: [boolean],
    writeConcern: [document]
  })
ParameterType설명
querydocumentupdate를 위한 selection criteria(기준)이다. find()의 query와 같다.
updatedocumentdocument에 update할 수정 사항이다.
upsertbooleanOption(Default: false) true로 설정하면 query criteria에 매칭하는
document가 없을 경우 새로운 document를 insert한다. false로 설정하면 insert하지 않는다.
multibooleanOption(Default: false) true로 설정하면 query criteria에 매칭하는
document 모두를 update한다. false로 설정하면 하나의 document만 update한다.
writeConcerndocumentOption. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다.
기본 설정을 사용하려면 이 설정을 생략한다.
  • collection 내의 document를 update한다.
    기본적으로 하나의 쿼리만 수정함.
  • $set을 해야 해당 필드만 바뀐다.
    만약 $set을 넣지 않고 그냥 { goal: 30 } 하면 다큐먼트의 내용이 다 지워지고 { goal: 30 } 이라는 객체로 통째로 바뀌어버린다.
db.player.update({
    "goal":110
}, {
    $set:{
    	"goal":120
    }
})
// goal:110인걸 검색해서 120으로 업데이트 하라
// update 첫번째인자는 검색 쿼리 key/field, 두번째 인자는 업데이트 쿼리 {$set: {key:field}}
Operator설명
$incfield의 value를 지정한 수만큼 증가시킨다.
$renamefield 이름을 rename한다.
$setOnInsertupdate()의 upsert가 true로 설정되었을 경우, document가 insert될 때의 field value를 설정한다.
$setupdate할 field의 value를 설정한다.
$unsetdocument에서 설정된 field를 삭제한다
$min설정값이 field value보다 작은 경우만 update한다
$max설정값이 field value보다 큰 경우만 update한다.
$currentDate현재 시간을 설정한다

4.4.1. 단일 데이터 수정

db.[collection_name].updateOne([query], [update], {option})
  • update와 사용법은 동일하다. 단지, 단일 도큐먼트만 수정될 뿐.

4.4.2. 다수 데이터 수정

db.[collection_name].updateMany([query], [update], {option})
  • update의 multi 옵션을 자동으로 사용해준 명령.

4.4.3. 도큐먼트 대체

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
}

4.4.4. FindAndModify()

  • update() 와는 달리 upsert(update + insert)과 remove까지 같이 수행. 한 행만 업데이트 한다.
ParameterType설명
querydocumentupdate를 위한 selection criteria(기준)이다. find()의 query와 같다.
updatedocumentdocument에 update할 수정 사항이다.
newboolean수정 이전의 다큐먼트를 반환할지, 수정 이후의 다큐먼트를 반환할 지 결정하는 부분. { new: true }를 넣으면 수정 이후의 다큐먼트를 반환
  • 수정한 후에 수정된 결과를 다시 가져오고 싶다면 update 대신 findAndModify 메소드를 쓰는 게 좋음

findAndModify()와 update() 차이점

-디폴트 옵션에서는 두 명령보두 하나의 문서만 변경할 수 있다.
하지만 update 명령은 multi 옵션을 true로 설정해서 여러 문서를 한번에 변경할 수 있다.

  • update 명령은 실제 어떤 문서를 변경할지 알 수없다. (매칭된 문서가 여러개일때)
    하지만 findAndModify는 sort 옵션을 통해 특정 문서를 정렬해 첫 번째 문서만 변경할 수 있다.
  • update명령은 처리 결과를 반환하지만, findAndModify는 변경전 혹은 직후의 문서를 결과로 반환한다.

FindOneAndUpdate() / FindOneAndReplace()

  • indAndModify는 update, upsert, remove를 모두 담당하는데, 이 기능을 쪼개서 하나의 역할만 전담하는 메소드 라 할 수있다.
  • 역시나 findAndModify 처럼 수정 이전 또는 이후의 다큐먼트를 반환 받는데, 대신 new 옵션이 아니라 returnNewDocument로 이름이 바뀌었다.
db.player.findOneAndUpdate(
    { name: 'Son' }, 
    { $set: { goal: 15 } }, 
    { returnNewDocument: true }
);

4.5. Delete 도큐먼트 삭제

db.collection.remove(
  [query],
  {
    justOne: [boolean],
    writeConcern: [document]
  }
)
ParameterType설명
querydocumentdeletion criteria(기준)이다. collection 내의 모든 document를 삭제할 경우, {}를 전달한다.
justOnebooleanOption(Default: false) true로 설정하면 하나의 document만 삭제한다.
생략하면 deletion criteria에 매칭하는 document 모두를 삭제한다.
writeConcerndocumentOption. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다.
기본 설정을 사용하려면 이 설정을 생략한다.
db.player.remove()
// 전체를 삭제

db.player.remove({"name":"Son"})
// 해당 Document 리스트를 모두 삭제

4.5.1. DeleteOne(), DeleteMany()

  • deleteOne()은 매칭되는 첫 번째 다큐먼트만 지움
  • deleteMany()는 매칭되는 모든 다큐먼트를 지움
  • remove() 메소드를 세분화한 것이다.

remove를 deleteOne, deleteMany로 나눈 이유?

예를들어, 댓글 테이블에 삭제 버튼을 누르면 remove 된다고 하면
remove는 기본적으로 다중 삭제 처리라서, 나는 해당 댓글 하나만 삭제하려고 하나의 버튼을 눌렀는데 여러개가 지워질수있다는 위험성을 안고 있다.

물론 Object.id 를 통해 다른 다큐먼트와 관계를 맺어서 지우는거니, 당연히 중복(다중 처리)이 발생할리는 없겠지만, 만일 유니크하지않은 다른 필드로 검색했을때 다중으로 지워질수 있는 실수를 미연에 방지하고, 보다 개발자로 하여금 직관적으로 메서드를 행함을(하나만 처리해라, 여러개 처리해라) 표현하기 위해 api를 추가로 만들었다라고 이해하면 된다.

참조 : 푸고배, Inpa Dev, poiemaweb

0개의 댓글