MySQL과 같은 SQL 데이터베이스와는 다른 유형의 데이터

  • NoSQL의 대표주자인 mongoDB(몽고디비)사용
SQL(MySQL) NoSQL(몽고디비)
규칙에 맞는 데이터 입력 테이블 간 JOIN 지원 안정성, 일관성 용어(테이블, 로우, 칼럼) 자유로운 데이터 입력 컬렉션 간 JOIN 미지원 확장성, 가용성 용어(컬렉션, 다큐먼트, 필드)

 

  • JOIN : 관계가 있는 테이블끼리 데이터를 합치는 기능(몽고디비 aggregate 흉내 가능)
  • 빅데이터, 메시징, 세션 관리 등(비정형 데이터)에는 몽고디비 사용하면 좋음
//몽고디비 실행 (아래 경로에서 shift 누르고 오른쪽 마우스 눌러서 powershell 실행
PS C:\Program Files\MongoDB\Server\7.0\bin> ./mongod --ipv6
{"t":{"$date":"2024-08-14T22:56:08.454+09:00"},"s":"I",  "c":"NETWORK",  "id":4915701, "ctx":"thread1","msg":"Initialized wire specification","attr":{"spec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":21},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":21},"outgoing":{"minWireVersion":6,"maxWireVersion":21},"isInternalClient":true}}}

 

//몽고쉘 실행
Please enter a MongoDB connection string (Default: mongodb://localhost/):

Current Mongosh Log ID: 66bcb84be9c5ca3e0a228fb4
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.15
Using MongoDB:          7.0.12
Using Mongosh:          2.2.15

For mongosh info see: https://docs.mongodb.com/mongodb-shell/


To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.

------
   The server generated these startup warnings when booting
   2024-08-14T22:56:09.973+09:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2024-08-14T22:56:09.973+09:00: This server is bound to localhost. Remote systems will be unable to connect to this server. Start the server with --bind_ip <address> to specify which IP addresses it should serve responses from, or with --bind_ip_all to bind to all interfaces. If this behavior is desired, start the server with --bind_ip 127.0.0.1 to disable this warning
------

test>
// admin 으로 변경
test> use admin
switched to db admin
// root 계정 생성
admin> db.createUser({user:'root', pwd:'manager', roles: ['root']})
{ ok: 1 }

 

mongod 있는 화면 끄고 다시 재실행

// --auth 붙여서 다시 실행
PS C:\Program Files\MongoDB\Server\7.0\bin> ./mongod --ipv6 --auth
{"t":{"$date":"2024-08-14T23:07:03.228+09:00"},"s":"I",  "c":"NETWORK",  "id":4915701, "ctx":"thread1","msg":"Initialized wire specification","attr":{"spec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":21},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":21},"outgoing":{"minWireVersion":6,"maxWireVersion":21},"isInternalClient":true}}}

 

//몽고쉘 경로에서 shift 누르고 오른쪽 마우스로 파워셀 열고 아래와 같이  root 계정으로 접속
PS C:\Users\john\Downloads\mongosh-2.2.15-win32-x64\mongosh-2.2.15-win32-x64\bin> ./mongosh admin -u root -p manager
Current Mongosh Log ID: 66bcbaa044900f7385228fb4
Connecting to:          mongodb://<credentials>@127.0.0.1:27017/admin?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.15
Using MongoDB:          7.0.12
Using Mongosh:          2.2.15

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

------
   The server generated these startup warnings when booting
   2024-08-14T23:07:03.627+09:00: This server is bound to localhost. Remote systems will be unable to connect to this server. Start the server with --bind_ip <address> to specify which IP addresses it should serve responses from, or with --bind_ip_all to bind to all interfaces. If this behavior is desired, start the server with --bind_ip 127.0.0.1 to disable this warning
------

admin>

 

컬렉션 생성하기

따로 생성할 필요 없음

  • 다큐먼트를 넣는 순간 컬렉션도 자동 생성됨 ( mysql과 비교하며 컬렉션 : 테이블, 다큐먼트 : 데이터 로우)
  • 직접 생성하는 명령어도 있음
// 컬렉션 직접 생성하는 명령어 ( db를 nodejs로  잘 선택해서 생성하기)
admin> use nodejs;
switched to db nodejs
nodejs> show dbs;
admin   132.00 KiB
config  108.00 KiB
local    72.00 KiB
nodejs> db
nodejs
nodejs> db.createCollection('users')
{ ok: 1 }
nodejs> db.createCollection('comments')
{ ok: 1 }
nodejs> show collections
comments
users
nodejs>

 

insert 명령어

 

// insert 한개는 insertOne, insert 여러개는 insertMany
// 몽고디비는 오타 체크를 안하니 주의하기
nodejs> db.users.insertOne({ name : 'zero', age: 24, married: false, comment: '안녕하세요. 간단히 몽고디비 사용 방법에  대해 알아봅시다.', createdAt: new Date() });
{
  acknowledged: true,
  insertedId: ObjectId('66bcbdc744900f7385228fb5')
}
nodejs> db.users.insertOne({ name : 'nero', age : 32, married: true, comment: '안녕하세요. zero 친구 nero입니다.', createdAt: new Date() });
{
  acknowledged: true,
  insertedId: ObjectId('66bcbe7144900f7385228fb6')
}

// 조회하기
nodejs> db.users.find({name:'zero'})
[
  {
    _id: ObjectId('66bcbdc744900f7385228fb5'),
    name: 'zero',
    age: 24,
    married: false,
    comment: '안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.',
    createdAt: ISODate('2024-08-14T14:23:03.633Z')
  }
]


// users에 해당하는 ObjectId를 아래와 같이  복사해서 insert 하는 명령어
nodejs> db.comments.insertOne({ commenter: ObjectId('66bcbdc744900f7385228fb5'), comment: '안녕하세요. zero의 댓글입니다.', createdAt: new Date() });
{
  acknowledged: true,
  insertedId: ObjectId('66bcbf5d44900f7385228fb7')
}
nodejs>

 

조회 명령어

// 조회하기 (find는 전체 조회, findOne으로 하나만 조회)
nodejs> db.users.find({});
[
  {
    _id: ObjectId('66bcbdc744900f7385228fb5'),
    name: 'zero',
    age: 24,
    married: false,
    comment: '안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.',
    createdAt: ISODate('2024-08-14T14:23:03.633Z')
  },
  {
    _id: ObjectId('66bcbe7144900f7385228fb6'),
    name: 'nero',
    age: 32,
    married: true,
    comment: '안녕하세요. zero 친구 nero입니다.',
    createdAt: ISODate('2024-08-14T14:25:53.749Z')
  }
]
nodejs> db.comments.find({});
[
  {
    _id: ObjectId('66bcbf5d44900f7385228fb7'),
    commenter: ObjectId('66bcbdc744900f7385228fb5'),
    comment: '안녕하세요. zero의 댓글입니다.',
    createdAt: ISODate('2024-08-14T14:29:49.856Z')
  }
]

 

두 번째 인수로 조회할 필드를 선택할 수 있음(1은 추가, 0은 제외)

nodejs> db.users.find({}, {_id : 0, name :1 , married:1 });
[ { name: 'zero', married: false }, { name: 'nero', married: true } ]

 

첫 번째 인수로 조회 조건 입력 가능

  • $gt나 $or같은 조건 연산자 사용
nodejs> db.users.find({ age: {$gt: 30}, married: true }, {_id : 0, name: 1, age: 1 });
[ { name: 'nero', age: 32 } ]
nodejs> db.users.find({ $or: [{ age : {$gt: 30}}, {married : false }]}, {_id : 0, name:1, age: 1});
[ { name: 'zero', age: 24 }, { name: 'nero', age: 32 } ]

 

update 명령어

 

nodejs> db.users.updateOne({name :'nero'}, {$set: { comment : '안녕하세요. 이 필드를 바꿔보겠습니다.'}});
{
  acknowledged: true, //정상반영
  insertedId: null,
  matchedCount: 1,  //하나를 찾아서
  modifiedCount: 1,  // 하나를 변경햇다.
  upsertedCount: 0
}

 

delete 명령어

//delete 명령어
nodejs> db.users.deleteOne({name: 'nero'});
{ acknowledged: true, deletedCount: 1 }

// delete 된 것 확인
nodejs> db.users.find({});
[
  {
    _id: ObjectId('66bcbdc744900f7385228fb5'),
    name: 'zero',
    age: 24,
    married: false,
    comment: '안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.',
    createdAt: ISODate('2024-08-14T14:23:03.633Z')
  }
]

 

 

'Javascript > Node' 카테고리의 다른 글

노드 교과서 섹션 4  (0) 2023.08.31
노드 교과서 섹션 5  (0) 2023.08.29
노드 교과서 섹션 8  (0) 2023.08.23
노드 교과서 섹션 9  (0) 2023.08.22
노드 교과서 섹션 10  (0) 2023.08.19

+ Recent posts