티스토리 뷰

책/nodejs 교과서

8. 몽고디비

안양사람 2021. 2. 24. 01:14
728x90
SMALL

윈도우

몽고디비 실행할려면 

c:\data\db 폴더가 있어야 돼. 먼저 만들어.

 

몽고디비 서버 실행

cd C:\Program Files\MongoDB\Server\4.4\bin

mongod or ./mogod

 

기본적으로 27017번 포트에서 실행된다. mysql은 3306이였나??

 

매번 실행하기 귀찮다면 명령 프롬프트를 관리자 권한으로 실행한 뒤 (버전 4.2는 버전에따라 바꿔요)

mongod --dbpath "C:\data\db" --logpath "C:\Program Files\MongoDB\Server\4.2\log\mongod.log" -- install --serviceName "MongoDB"

명령어 입력 후 윈도 작업 표시줄 검색창에서 services.msc 파일을 검색하여 실행

mongodb 찾아서 실행중으로 바꿔

중지하고 싶으면 중지하면 돼. 여기서 . 다시시작이나

 

서버가 실행된 상태에서

mongo

> use admin
switched to db admin
> db.createUser({user:'이름', pwd:'비밀번호', roles:['root']})
Successfully added user: { "user" : "이름", "roles" : [ "root" ] }

(이름 비밀번호는 바꿔)

(createUser로 계정을 생성.)

 

mongod --auth로 접속 (--auth는 로그인이 필요하다는 뜻)

mongo admin -u 이름 -p 비밀번호

 

리눅스(우분투)

명령어는 공식사이트에서 참고

docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org

 

실행

sudo systemctl start mongod

sudo systemctl enable mongod

 

종료, 재시작

sudo systremctl stop mongod

sudo systemctl restart mongod

 

mongo 입력했을 때 >나오면 성공

누구나 몽고디비에 접속할 수 있으므로 관리자 계정 추가

use admin

db.createUser ~~ 아까랑 같아

 

ctl c로 종료하고 몽고디비가 인증을 사용하도록 설정

sudo systemctl stop mongod

vim /etc/mongod.conf

다음 두줄을 추가. a를 눌러 입력보드 전환. esc눌러 명령어 모드로 전환. :wq!로 저장

security:

  authorization: enabled

 

다시 mongod를 실행하고 mongo admin -u 이름 -p 비밀번호로 접속

sudo systemctl start mongod

mongo admin -u 이름 -p 비밀번호

 

 

데이터베이스 및 컬렉션 생성하기

데이터베이스 만들기 : use [데이터베이스명]

목록 확인 : show dbs

(데이터가 한 개 이상 있어야 목록에 표시돼)

현재 사용 중인 데이터베이스를 확인 : db

생성 db.createCollection('~~')

생성한 컬렉션 목록 : show collections

 

컬렉션은 MYSQL의 테이블에 대응.

CRUD 작업하기

CREATE

Date나 정규표현식 같은 자바스크립트 객체를 자료형으로 사용할 수 있고, Binary Data, ObjectId, Int, Long, Decimal, Timestamp, Javascript 등의 추가적인 자료형이 있다. ObjectId, Binar Data, Timestamp 외에는 잘 사용안돼

 

db.컬렉션명.save(다큐먼트)로 다큐먼트를 생성

> db.users.save({name:'zero',age:24,married:false,comment:'안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.',createdAt:new Date()});
WriteResult({ "nInserted" : 1 })
> db.users.save({name:'nero',age:32,married:true,comment:'안녕하세요. zero 친구 nero입니다.',createdAt:new Date()});
WriteResult({ "nInserted" : 1 })

> db.comments.save({commenter:ObjectId('603500a1e24e73ddb2f3c92b'),comment:'안녕하세요. zero의 댓글입니다.',createdAt:new Date()});
WriteResult({ "nInserted" : 1 })

 

READ

find({}) : 컬렉션 내의 모든 다큐먼트를 조회하라는 뜻

특정 필드만 조회하고 싶다면 두번째 인수로 조회할 필드. 1또는 true로 표시한 필드만 가져온다.

_id는 기본적으로 가져오게 되어 있으므로 0또는 false를 입력했음

조회 시 조건을 주려면 첫번째 인수 객체에 기입.

시퀄라이즈 쿼리와 비슷

$gt(초과), $gte(이상), $lt(미만), $lte(이하), $ne(같지 않음), $or(또는), $in(배열 요소 중 하나)

sort : -1은 내림차순, 1은 오름차순

limit : 조회할 개수

skip : 건너뒬지

> db.users.find({});
{ "_id" : ObjectId("603500a1e24e73ddb2f3c92b"), "name" : "zero", "age" : 24, "married" : false, "comment" : "안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.", "createdAt" : ISODate("2021-02-23T13:18:25.462Z") }
{ "_id" : ObjectId("603500fde24e73ddb2f3c92c"), "name" : "nero", "age" : 32, "married" : true, "comment" : "안녕하세요. zero 친구 nero입니다.", "createdAt" : ISODate("2021-02-23T13:19:57.786Z") }
> db.comments.find({});
{ "_id" : ObjectId("603504dbe24e73ddb2f3c92d"), "commenter" : ObjectId("603500a1e24e73ddb2f3c92b"), "comment" : "안녕하 세요. zero의 댓글입니다.", "createdAt" : ISODate("2021-02-23T13:36:27.971Z") }


> db.users.find({age:{$gt:30},married:true},{_id:0,name:1,age:1});
{ "name" : "nero", "age" : 32 }

> db.users.find({$or:[{age:{$gt:30}},{married:false}]},{_id:0,name:1,age:1});
{ "name" : "zero", "age" : 24 }
{ "name" : "nero", "age" : 32 }

> db.users.find({},{_id:0,name:1,age:1}).sort({age:-1}).limit(1).skip(1)
{ "name" : "zero", "age" : 24 }

 

UPDATE

첫번째 객체는 수정할 다큐먼트를 저장하는 객체

두번째 객체는 수정할 내용을 입력하는 객체

$set : 어떤 필드를 수정할지 정하는 연산자. 이 연산자를 사용하지 않으면 통째로 바뀐다.

> db.users.update({name:'nero'},{$set:{comment:'안녕하세요. 이 필드를 바꿔보겠습니다!'}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

 

DELETE

> db.users.remove({name:'nero'})
WriteResult({ "nRemoved" : 1 })


몽구스 사용하기

몽구스는 시퀄라이즈와 달리 ODM(Object Document Mapping)이라고 불린다. 몽고디비는 릴레이션이 아니라 다큐먼트를 사용하므로 ORM이 아니라 ODM이다.

장점이 뭘까

1. 스키마가 생김

2. JOIN기능을 populate 메서드로 어느 정도 보완함

 

npm i express morgan nunjucks mongoose

npm i -D nodemon

 

schema/index.js

const mongoose = require('mongoose');

const connect = () => {
  if (process.env.NODE_ENV !== 'production') {
    mongoose.set('debug', true);
  }
  mongoose.connect(
    'mongodb://이름:비밀번호@localhost:27017/admin',
    {
      dbName: 'nodejs',
      useNewUrlParser: true,
      useCreateIndex: true,
    },
    (error) => {
      if (error) {
        console.log('몽고디비 연결 에러', error);
      } else {
        console.log('몽고디비 연결 성공');
      }
    }
  );
};
mongoose.connection.on('error', (error) => {
  console.error('몽고디비 연결 에러', error);
});
mongoose.connection.on('disconnected', () => {
  console.error('몽고디비 연결이 끊어졌습니다. 연결을 재시도합니다.');
  connect();
});

module.exports = connect;

 

1. 개발 환경일 때만 콘솔을 통해 몽구스가 생성하는 쿼리 내용을 확인할 수 있게 하는 코드

2. 몽구스와 몽고디비를 연결하는 부분. 접속 시도하는 데이터베이스는 admin이지만, 실제로 사용할 데이터베이스는 nodejs이므로 두번째 인수로 dbName 옵션을 줘서 nodejs 데이터베이스를 사용하게 했다.

3. 몽구스 커넥션에 이벤트 리스너를 달아두었다. 에러 발생 시 에러 내용을 기록하고, 연결 종료 시 재연결을 시도

 

스키마 정의

몽구스 스키마에서 특이한 점은 String, Number, Date, Buffer, Boolean, Mixed, ObjectId, Array를 값으로 가질 수 있다는 점이다. 몽고디비의 자료형과 조금 다르며, 편의를 위해 종류 수를 주여두었다.

 

const mongoose = require('mongoose');

const { Schema } = mongoose;
const userSchema = new Schema({
  name: {
    type: String,
    required: true,
    unique: true,
  },
  age: {
    type: Number,
    required: true,
  },
  married: {
    type: Boolean,
    required: true,
  },
  comment: String,
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

module.exports = mongoose.model('User', userSchema);

type을 ObjectId 하는거, ref:'User

이걸로 JOIN 비스무리하게 할꺼야

const mongoose = require('mongoose');

const { Schema } = mongoose;
const {
  Types: { ObjectId },
} = Schema;
const commentSchema = new Schema({
  commenter: {
    type: ObjectId,
    required: true,
    ref: 'User',
  },
  comment: {
    type: String,
    required: true,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

module.exports = mongoose.model('Comment', commentSchema);

 

create

      const user = await User.create({
        name: req.body.name,
        age: req.body.age,
        married: req.body.married,
      });

read

    const users = await User.find({});
    
    const comments = await Comment.find({ commenter: req.params.id })
      .populate('commenter');

update

      const result = await Comment.update({
        _id: req.params.id,
      }, {
        comment: req.body.comment,
      });

delte

      const result = await Comment.remove({ _id: req.params.id });

 

나머지는 책코드참조

728x90
LIST

' > nodejs 교과서' 카테고리의 다른 글

10. API 서버 이해하기  (0) 2021.02.27
9. 익스프레스로 SNS 서비스 만들기  (1) 2021.02.25
7. MYSQL  (0) 2021.02.22
6. 익스프레스 웹 서버 만들기  (0) 2021.02.21
5. 패키지 매니저  (0) 2021.02.20
댓글
공지사항