on
몽고디비
몽고디비
몽고디비 설치는 생략
몽고디비 연결하기
윈도의 경우 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