잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).
여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.
감사합니다. -현록
현록의 기록저장소
MongoDB 기초 본문
이전 포스트에서 mongosh로 MongoDB Shell로 접속한 후의 상황에서 이어진다.
[Study/MongoDB] - Docker Compose로 MongoDB 환경 세팅
blackdeer@Mac mongodb % docker exec -it mongodb /bin/bash root@mongodb:/# mongo bash: mongo: command not found root@mongodb:/# mongosh -u root -p example Current Mongosh Log ID: 64afa30efd5fb964295551f8 Connecting to: mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.10.1 Using MongoDB: 6.0.7 Using Mongosh: 1.10.1 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ ------ The server generated these startup warnings when booting 2023-07-13T07:01:43.903+00:00: vm.max_map_count is too low ------ test> show databases admin 100.00 KiB config 60.00 KiB local 72.00 KiB |
RDB의 용어와 비교하자면 다음과 같다
RDB |
MongoDB |
Database |
Database |
Table |
Collection |
Column |
Field |
Row |
Document |
RDB는 Table에 Column설정을 하고 데이터들을 Row 형태로 저장할텐데,
Document형 NoSQL인 MongoDB는 Collection에 json형식의 Document를 저장한다.
json문서가 데이터이며 내부 키(Field)들이 RDB의 Column과 닮았다고 할 수 있는데,
RDB처럼 Table 생성시 정한 Column들만 사용할 수 있는 것이 아니라
문서를 어떻게 작성하느냐에 따라 언제든 스키마 수정 없이(스키마를 정의하지도 않았으니) 가변적으로 활용할 수 있다.
그래서 하위 항목으로 갈 수록(Column, Row) 용어를 1:1로 완벽하게 매칭시킬 순 없다.
유연성은 더 좋지만 반대로 속도나 무결성 등에 대해서는 잃는 것도 있기 때문에 어느 쪽이 반드시 좋다고 할 순 없다.
(그리고 이 수치는 RDB에서 얼마나 JOIN을 하는지, 데이터 디자인이 어떤지에 따라서도 달리지기 때문에
반드시 뒤쳐지고 반드시 좋아진다고 단정지을 수 없는 부분이다.
이러한 이론에 대한 부분은 이 포스트에서 다루지 않는다.)
use 데이터베이스명으로 데이터베이스를 생성한다.
이건 정확하게는 현재 사용할 db를 선택하는 것이다.
test> show databases admin 100.00 KiB config 72.00 KiB local 72.00 KiB
test> use test01 switched to db test01
test01> show dbs admin 100.00 KiB config 72.00 KiB local 72.00 KiB |
그런데 쉘 앞만 test에서 우리가 생성한 데이터베이스명(test01)으로 바뀌었을 뿐 데이터베이스는 아직 만들어지지 않은 것 같다.
MongoDB에서는 실제로 document나 collection을 생성해야만 DB가 생성된다.
원문: MongoDB only creates the database when you first store data in that database. This data could be a collection or a document.
(https://www.mongodb.com/basics/create-database)
Mongo Express의 GUI를 통해서 database를 생성해도
내부에는 delete_me 라는 이름의 빈 collection이 포함된 채로 database가 생성되게 된다.
collection을 생성해보자
test01> db.createCollection('book') { ok: 1 }
test01> show databases admin 100.00 KiB config 108.00 KiB local 72.00 KiB test01 8.00 KiB |
이제는 database가 생성된 것을 볼 수 있다.
이제 collection 안에 문서를 저장해보자
test01> db.book.find()
test01> db.book.insertOne({"author": "Kim", "title": "Easy Cooking"}) { acknowledged: true, insertedId: ObjectId("64afe579952fbf5c1d6a917d") }
test01> db.book.insertMany([{"author": "Park", "title": "Chemical Science", "publisher": "Han-sam"}, {author: "Lee", title: "Cat Holic"}]) { acknowledged: true, insertedIds: { '0': ObjectId("64afe58e952fbf5c1d6a917e"), '1': ObjectId("64afe58e952fbf5c1d6a917f") } }
test01> db.book.find() [ { _id: ObjectId("64afe579952fbf5c1d6a917d"), author: 'Kim', title: 'Easy Cooking' }, { _id: ObjectId("64afe58e952fbf5c1d6a917e"), author: 'Park', title: 'Chemical Science', publisher: 'Han-sam' }, { _id: ObjectId("64afe58e952fbf5c1d6a917f"), author: 'Lee', title: 'Cat Holic' } ] |
json형식으로 작성한 문구를 하나씩 혹은 여러개를 저장할 수 있고,
collection을 만들 때 RDB처럼 column을 정해둔 것이 아니기에
문서마다 다른 키를 가져도 상관없이 저장할 수 있다.
기존 문서의 수정과 확인(특정 조건 문서 조회)
test01> db.book.updateOne({_id: ObjectId("64afe58e952fbf5c1d6a917f")}, {$set: {author: "Kim"}}) { acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
test01> db.book.find({author: 'Kim'}) [ { _id: ObjectId("64afe579952fbf5c1d6a917d"), author: 'Kim', title: 'Easy Cooking' }, { _id: ObjectId("64afe58e952fbf5c1d6a917f"), author: 'Kim', title: 'Cat Holic' } ] |
문서의 삭제
test01> db.book.deleteOne({_id: ObjectId("64afe579952fbf5c1d6a917d")}) { acknowledged: true, deletedCount: 1 }
test01> db.book.find({author: "Kim"}) [ { _id: ObjectId("64afe58e952fbf5c1d6a917f"), author: 'Kim', title: 'Cat Holic' } ] |
collection의 삭제
test01> db.book.drop() true
test01> show dbs admin 100.00 KiB config 108.00 KiB local 72.00 KiB |
database에 남은 collection이 하나도 없기 때문에 database도 지워진다.
여전히 test01 db를 사용하는 상태이기 때문에 collection을 추가하면 바로 database와 함께 collection이 생성될 것.
database의 삭제
test01> db.dropDatabase() { ok: 1, dropped: 'test01' }
test01> db.dropDatabase() { ok: 1, dropped: 'test01' } |
database 내부의 collection이나 document들 모두와 함께 지울 수 있다.
MongoDB의 유저 생성은 admin database에 기록된다
test01> use admin switched to db admin
admin> db.createUser({user: "user01", pwd: "123456", roles: [{role: "readWrite", db: "test01"}]}) { ok: 1 } |
위는 Mongo Express에서 확인한 화면(admin>system.users)
https://www.mongodb.com/docs/v6.0/tutorial/create-users/
https://www.mongodb.com/docs/v6.0/tutorial/manage-users-and-roles/
메뉴얼에서 다른 예제나 수정 및 커스텀 권한 등도 찾아볼 수 있다.
공식 문서 중 기초 부분
https://www.mongodb.com/basics
'Study > MongoDB' 카테고리의 다른 글
Docker Compose로 MongoDB 환경 세팅 (0) | 2023.07.13 |
---|
잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).
여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.
감사합니다. -현록