Skip to content

Commit

Permalink
docs: update files by using obsidian
Browse files Browse the repository at this point in the history
  • Loading branch information
LeeSM0518 committed Dec 27, 2024
1 parent a4914e7 commit 8d17f01
Showing 1 changed file with 302 additions and 15 deletions.
317 changes: 302 additions & 15 deletions _posts/2024-12-26-mongo-db.md
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,28 @@ video.movies
<br/>
##### 인증
```sh
db> use admin
switched to db admin
admin> db.auth('root','root')
{ ok: 1 }
admin> show users
[
{
_id: 'admin.root',
userId: UUID('9a65918d-12f8-471c-b59b-51815739c9e7'),
user: 'root',
db: 'admin',
roles: [ { role: 'root', db: 'admin' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
]
```
<br/>
##### 생성
`insertOne` 함수는 컬렉션에 도큐먼트를 추가한다. 우선 도큐먼트를 나타내는 자바스크립트 객체인 movie라는 지역 변수를 생성한다.
Expand All @@ -370,21 +392,6 @@ video> movie = {"title" : "Star Wars: Episode IV - A New Hope",
`insertOne` 함수를 이용해 movies 컬렉션에 저장할 수 있다.
```sh
db> use admin
switched to db admin
admin> db.auth('root','root')
{ ok: 1 }
admin> show users
[
{
_id: 'admin.root',
userId: UUID('9a65918d-12f8-471c-b59b-51815739c9e7'),
user: 'root',
db: 'admin',
roles: [ { role: 'root', db: 'admin' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
]
admin> db.movies.insertOne(movie)
{
acknowledged: true,
Expand Down Expand Up @@ -417,6 +424,286 @@ admin> db.movies.find().pretty()
##### 읽기
`find``findOne` 은 컬렉션을 쿼리하는 데 사용한다. 단일 도큐먼트를 읽으려면 `findOne` 을 사용하면 된다.
```sh
admin> db.movies.findOne()
{
_id: ObjectId('676e4a4046b45663fdfc0422'),
title: 'Star Wars: Episode IV - A New Hope',
director: 'George Lucas',
year: 1977
}
```
- `find``findOne`**쿼리 도큐먼트** 형태로 조건 전달도 가능하다.
<br/>
##### 갱신
데이터를 갱신하려면 `updateOne` 을 사용한다. `updateOne` 의 매개변수는 최소 두 개다. 첫 번째는 **수정할 도큐먼트를 찾는 기준**이고, 두 번째는 **갱신 작업**을 설명하는 도큐먼트이다. 갱신하려면 갱신 연산자인 `set` 을 이용하면 된다.
```sh
admin> db.movies.updateOne({title: "Star Wars: Episode IV - A New Hope"},
... {$set : {reviews: []}})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
admin> db.movies.find().pretty()
[
{
_id: ObjectId('676e4a4046b45663fdfc0422'),
title: 'Star Wars: Episode IV - A New Hope',
director: 'George Lucas',
year: 1977,
reviews: []
}
]
```
- `review` 키가 생긴 것을 확인할 수 있다.
<br/>
##### 삭제
`deleteOne``deleteMany` 는 도큐먼트를 데이터베이스에서 영구적으로 삭제한다. 두 함수 모두 필터 도큐먼트로 삭제 조건을 지정한다.
```sh
admin> db.movies.deleteOne({title : "Star Wars: Episode IV - A New Hope"})
{ acknowledged: true, deletedCount: 1 }
admin> db.movies.find().pretty()

```
- 필터와 일치하는 모든 도큐먼트를 삭제하려면 `deleteMany` 를 사용한다.
<br/>
### 2.6. 데이터형
---
몽고DB는 도큐먼트의 값으로 다양한 데이터형을 지원한다.
<br/>
#### 2.6.1. 기본 데이터형
---
몽고DB에서 도큐먼트는 JSON과 닮았다고 생각할 수 있다. 이는 여섯 가지 데이터형만을 열거하다. 데이터형이 null, 불리언, 숫자, 문자열, 배열, 객체만 지원하기 때문에 표현력은 제한적이다.
JSON은 날짜형이 없어 날짜를 다루기가 까다롭다. 부동소수점형과 정수형을 표현하는 방법이 없고, 32비트와 64비트도 구별되지 않는다.
몽고DB는 JSON의 키/값 쌍 성질을 유지하면서 추가적인 데이터형을 지원한다. 가장 일반적인 데이터형은 다음과 같다.
<br/>
null
: null 값과 존재하지 않는 필드를 표현하는 데 사용한다.
불리언
: 참과 거짓 값에 사용한다.
숫자
: 셸은 64비트 부동소수점 수를 기본으로 사용한다. 4바이트 혹은 8바이트의 부호 정수는 각각 `NumberInt` 혹은 `NumberLong` 클래스를 사용한다.
문자열
: 어떤 UTF-8 문자열이든 표현할 수 있다.
날짜
: 몽고DB는 1970년 1월 1일부터의 시간을 1/1000초 단위로 나타내는 64비트 정수로 날짜를 저장한다.
정규표현식
: 쿼리는 자바스크립트의 정규 표현식 문법을 사용할 수 있다.
배열
: 값의 셋이나 리스트를 배열로 표현할 수 있다.
내장 도큐먼트
: 도큐먼트는 부모 도큐먼트의 값으로 내장된 도큐먼트 전체를 포함할 수 있다.
객체 ID
: 객체 ID는 도큐먼트용 12바이트 ID다. (ex `ObjectId()`)
<br/>
다음은 상대적으로 덜 사용되는 데이터형 목록이다.
이진 데이터
: 임의의 바이트 문자열이며 셸에서는 조작이 불가능하다.
코드
: 쿼리와 도큐먼트는 임의의 자바스크립트 코드를 포함할 수 있다. (ex. `function () { /* ... */ }`)
<br/>
#### 2.6.2. 날짜
---
자바스크립트에서 Date 클래스는 몽고DB의 날짜를 표현하는 데 사용한다. 새로운 Date 객체를 생성할 때는 `new Date()` 를 호출해야 한다. 셸에서는 날짜가 현지 시간대 설정을 이용해 표시되며, 표준 시간대 정보는 없다.
<br/>
#### 2.6.3. 배열
---
배열은 **정렬 연산(리스트, 스택, 큐)****비정렬 연산(셋)**에 호환성 있게 사용 가능한 값이다.
```sh
{"thighs" : ["pie", 3.14]}
```
- 서로 다른 데이터형을 값으로 포함할 수 있다.
- 심지어는 중첩 배열도 될 수 있다.
<br/>
도큐먼트 내 배열의 장점으로 몽고DB가 **배열의 구조를 '이해한다'**는 점과, 배열의 내용에 작업을 수행하기 위해 **내부에 도달하는 방법을 안다**는 점이 있다. 따라서 배열에 쿼리하거나 배열의 내용을 이용해 인덱스를 만들 수 있다.
<br/>
#### 2.6.4. 내장 도큐먼트
---
도큐먼트는 키에 대한 값이 될 수 있는데 이를 **내장 도큐먼트**라고 한다.
```json
{
"name" : "John Doe",
"address" : {
"street" : "123 Park Street",
"city" : "Anytown",
"state" : "NY"
}
}
```
- address는 내장 도큐먼트이다.
- 이러한 특성으로 몽고DB는 데이터 반복이 생길 수 있다는 단점이 있다.
<br/>
#### 2.6.5. _id와 ObjectId
---
몽고DB에 저장된 모든 도큐먼트는 `_id` 키를 가진다. `_id` 키 값은 어떤 데이터형이어도 상관없지만 `ObjectId` 가 기본이다. 하나의 컬렉션에서 모든 도큐먼트는 고유한 `_id` 값을 가지며, 이 값은 컬렉션 내 **모든 도큐먼트가 고유하게 식별되게 한다.**
<br/>
##### ObjectIds
`ObjectId``_id` 의 기본 데이터형이다. `ObjectId` 클래스는 가벼우면서도, 전역적으로 고유하게 생성하기 쉽게 설계됐다. `ObjectId` 를 사용하는 이유는 몽고DB의 **분산 특성** 때문이다.
`ObjectId` 는 12바이트 스토리지를 사용하며 24자리 16진수 문자열 표현이 가능하다. 바이트당 2자리를 사용한다.`ObjectId` 가 16진수 문자열로 표현되긴 하지만 실제로 문자열은 저장된 데이터의 두 배만큼 길다는 점을 알아두자.
`ObjectId` 의 첫 4바이트는 타임스탬프다. 다음 5바이트는 랜덤 값이다. 최종 3바이트는 서로 다른 시스템에서 충돌하는 `ObjectId` 들을 생성하지 않도록 랜덤 값으로 시작하는 카운터다. `ObjectId` 는 프로세스당 1초에 256^3(1677만7216)개까지 생성된다.
<br/>
##### _id 자동 생성
도큐먼트를 입력할 때 `_id` 키를 명시하지 않으면 입력된 도큐먼트에 키가 자동으로 추가된다.
<br/>
### 2.7. 몽고DB 셸 사용
---
다른 장비나 포트에 mongod를 연결하려면 셸을 시작할 때 호스트명, 포트, 데이터베이스를 명시해야 한다.
```sh
$ mongosh some-host:30000/myDB
```
- db는 이제 some-host:30000의 myDB 데이터베이스를 참조한다.
- `--nodb` 옵션을 사용하면 어디에도 연결되지 않은 채 셸을 시작할 수 있다.
- 시작한 후 원하는 때에 `new Mongo(호스트명)` 를 실행함으로써 연결할 수 있다.
<br/>
#### 2.7.1. 셸 활용 팁
---
mongo는 자바스크립트 문서를 참조하면 유용하다. 또한 help를 입력하면 셸에 내장된 도움말을 볼 수 있다. 함수의 기능을 알고 싶으면 함수명을 괄호 없이 입력하면 된다.
<br/>
#### 2.7.2. 셸에서 스크립트 실행하기
---
다음과 같이 자바스크립트 파일을 셸로 전달해 실행할 수도 있다.
```sh
$ mongosh test.js
```
<br/>
또한 `load` 함수를 사용해 대화형 셸에서 스크립트를 실행할 수도 있다.
```sh
test> load('test.js')
true
```
<br/>
스크립트에 주어진 포트에서 로컬로 실행되는 데이터베이스에 연결하고 해당 연결에 db를 설정하는 `connectTo` 함수를 정의하여 사용할 수 있다. **자주 하는 작업이나 관리 작업을 자동화하는 데 셸을 사용**한다.
<br/>
#### 2.7.3. `.mongorc.js` 만들기
---
자주 로드되는 스크립트를 `.mongorc.js` 파일에 넣을 수 있다.
```js
// .mongorc.js
var compliment = ["attractive", "intelligent", "like Batman"];
var index = Math.floor(Math.random()*3);
print("Hello, " + compliment[index] + " today!");
```
- 그러면 셸을 시작할 때마다 다음과 같은 문구가 뜬다.
<br/>
`.mongorc.js` 스크립트로 사용하고 싶은 전역 변수를 설정하고, 긴 별칭을 짧게 만들고, 내장 함수를 재정의한다. `.mongorc.js` 의 일반적인 용법 중 하나는 위험한 명령어를 제거하는 것이다. `dropDatabase``deleteIndexes` 같은 함수가 아무것도 수행하지 않게 재정의하거나 모두 선언 해제한다.
```js
var no = function() {
print("Not on my watch.");
}
// 데이터베이스 삭제 방지
db.dropDatabase = DB.prototype.dropDatabase = no;
// 컬렉션 삭제 방지
DBCollection.prototype.drop = no;
// 인덱스 삭제 방지
DBCollection.prototype.dropIndex = no;
```
<br/>
#### 2.7.4. 프롬프트 커스터마이징하기
---
기본 셸 프롬프트는 문자열이나 함수에 `prompt` 변수를 설정해 재정의한다.
<br/>
Expand Down

0 comments on commit 8d17f01

Please sign in to comment.