몽고디비

몽고디비

몽고디비 설치는 생략

몽고디비 연결하기

윈도의 경우 C:\에 data 폴더를 만들고 그 안에 db 폴더를 만듦

콘솔로 몽고디비가 설치된 경로(기본적으로 C:\Program Files\MongoDB\Server\4.2\bin)로 이동해 몽고디비를 실행

다른 콘솔을 하나 더 열어 mongo 명령어 입력

어드민 설정하기

어드민 권한을 설정하여 디비에 비밀번호 걸기

mongod를 입력했던 콘솔을 종료한 후 mongod --auth 명령어로 접속

--auth는 로그인이 필요하다는 뜻

mongo를 입력한 콘솔도 종료한 후 mongo admin –u 이름 –p 비밀번호로 접속

커넥션 생성하기

컴퍼스(MongoDB Compass Community)로 접속

Fill in connection Fields individually 클릭

컴퍼스 실행 화면

Authentication 을 Username/Password로 변경, 몽고디비 계정 이름과 비밀번호 입력

컴퍼스 실행 화면 접속 성공 화면

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

데이터베이스 생성하기

use 데이터베이스명으로 생성

show dbs로 목록 확인

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

컬렉션 생성하기

따로 생성할 필요 없음

다큐먼트를 넣는 순간 컬렉션도 자동 생성됨

직접 생성하는 명령어도 있음

show collectinos로 현재 컬렉션 확인

CRUD 작업하기

Create

몽고디비는 컬럼을 정의하지 않아도 됨

자유로움이 장점, 무엇이 들어올지 모른다는 단점

자바스크립트의 자료형을 따름(차이점도 존재)

ObjectId: 몽고디비의 자료형으로 고유 아이디 역할을 함

save method로 저장

Create(관계 설정)

컬렉션 간 관계를 강요하는 제한이 없으므로 직접 ObjectId를 넣어 연결

사용자의 ObjectId를 찾은 뒤 댓글 컬렉션에 넣음

Read

find로 모두 조회, findOne으로 하나만 조회

Read(조건)

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

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

$gt나 $or같은 조건 연산자 사용

정렬은 sort 메서드로 함

limit 메서드로 조회할 다큐먼트 개수 제한

skip 메서드로 건너뛸 다큐먼트 개수 제공

Update

update 메서드로 쿼리

첫 번째 인수로 수정 대상을, 두 번째 인수로 수정 내용을 제공

$set을 붙이지 않으면 다큐먼트 전체가 대체되므로 주의

결과로 수정된 개수가 나옴

Delete

remove 메서드로 쿼리

첫 번째 인수로 삭제할 대상 조건 제공

성공 시 삭제된 개수가 반환됨

몽구스 사용하기

몽구스 ODM

몽고디비 작업을 쉽게 할 수 있도록 도와주는 라이브러리

ODM: Object Document Mapping: 객체와 다큐먼트를 매핑(1대1 짝지음)

몽고디비에 없어 불편한 기능들을 몽구스가 보완

테이블과 유사한 기능, JOIN 기능 추가

https://github.com/zerocho/nodejs-book/tree/master/ch8/8.6/learn-mongoose ( 참고 코드 )

프로젝트 세팅 후 , 콘솔을 통해 경로로 이동한 후 package.json 설치

몽고디비 연결하기

몽구스를 통해 몽고디비 연결하기

인증은 admin 데이터베이스에서, 서비스는 dbName 데이터베이스에서

// schemas/index.js const mongoose = require('mongoose'); const connect = () => { if (process.env.NODE_ENV !== 'production') { mongoose.set('debug', true); } mongoose.connect('mongodb://root:nodejsbook@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;

앱과 연결하기

app.js 로 연결

schemas/index.js의 함수가 실행됨

mongoose.connect 함수가 몽고디비에 연결을 시도

mongoose.set은 디버깅 모드(모드를 켰을 때 콘솔에 쿼리가 찍힘)

연결이 끊기면(disconnection) 다시 연결을 시도

// app.js const express = require('express'); const path = require('path'); const morgan = require('morgan'); const nunjucks = require('nunjucks'); const connect = require('./schemas'); const indexRouter = require('./routes/index'); const usersRouter = require('./routes/users'); const commentsRouter = require('./routes/comments'); const app = express(); app.set('port', process.env.PORT || 3002); app.set('view engine', 'html'); nunjucks.configure('views', { express: app, watch: true, }); connect(); app.use(morgan('dev')); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/comments', commentsRouter); app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); error.status = 404; next(error); }); app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; res.status(err.status || 500); res.render('error'); }); app.listen(app.get('port'), () => { console.log(app.get('port'), '번 포트에서 대기 중'); });

스키마 정의하기

schemas 폴더 안에 작성

MySQL의 테이블처럼 정해진 데이터만 들어갈 수 있게 강제함

type은 자료형, require는 필수 여부 default는 기본값, unique는 고유 여부

// schemas/comment.js 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);

// schemas/user.js 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);

from http://jhg3410.tistory.com/27 by ccl(A) rewrite - 2021-11-12 02:27:30