진취적 삶
08 몽고디비 본문
몽고디비는 RDBMS 가 아니라 특색이 뚜렷한 NoSQL 이다 .
8.1 NoSQL vs SQL
SQL(MySQL) NoSQL(몽고디비)
규칙에 맞는 데이터 입력 | 자유로운 데이터 입력 |
테이블간 JOIN 진원 | 컬렉션간 JOIN 미지원 |
안정성,일관성 | 확장성,가용성 |
용어(테이블 ,로우.컬럼) | 용어(컬렉션,다큐먼트 ,필드) |
8.2 몽고 디비 설치 및 실행
파일 이동
C:\\Program Files\\MongoDB\\bi
shell 실행
mongsh
8.4 데이터베이스 및 컬렉션 생성하기
데이터 베이스 만들기
use nodejs
목록 확인
show dbs
admin 132.00 KiB
config 108.00 KiB
local 72.00 KiB
컬렉션은 테이블이랑 같은말
8.5 CRUD 작업하기
8.5.1 CREATE
db.컬렉션명.insertOne(다큐먼트)
db.users.insertOne({name:'nero', age:32 ,married:true , comment:'안녕하세요 수하 친구입니다.' ,createdAt:new Date() });
db.comments.insertOne({commenter:ObjectId('6441fb94d4d3b5159ff055e7'), comment:"안녕하세요 수하의 댓 글입니다. " ,createdAt:new Date() })
8.5.2 READ
db.users.find({})
db.comments.find({})
db.users.find({},{_id:0,name:1}) // 표시할 값은 true 표시 안할값은 false
[ { name: 'suha' }, { name: 'nero' } ]
db.users.find({age:{$gt:30},married:true},{_id:0 , name:1,age:1});
[ { name: 'nero', age: 32 } ]
연산자는 $gt(초과) $gte(이상) $ lt(미만) $lte(이하) $ne(같지 않음) $or(또는) $(in) 배열 요소 하나
db.users.find({},{_id:0,name:1,age:1}).sort({age:-1})
[ { name: 'nero', age: 32 }, { name: 'suha', age: 26 } ]
sort -1 은 내림차순 1 은 오름차순
8.5.3 Update
db.users.updateOne({name:'suha'} ,{$set : {comment: '안녕 이 필드 바꿀꺼임'}});
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
8.5.4 Delete
db.users.deleteOne({name:'nero'})
{ acknowledged: true, deletedCount: 1 }
8.6 몽구스 사용하기
몽구스는 시퀄라이즈와 달리 ODM (object Document Mapping) 이라고 불린다.
몽고디비는 릴레이션이 아니라 다큐먼트를 사용하니깐 ORM 이 아니라 ODM이다 .
몽구스는 몽고디비에 데이터를 넣기전에 노드 서버 단에서 데이터를 한번 필터링하는 역할을 한다.
8.6.1 몽고디비 연결하기
index .js
const mongoose = require("mongoose");
// 개발환경일 때만 mongoose 가 생성하는 쿼리 내용 확인 가능
const connect = async () => {
try {
if (process.env.NODE_ENV !== "production") {
mongoose.set("debug", true);
}
//mongoose 와 몽고디비 연결
mongoose.connect("mongodb://[id]:[password]@localhost:27017/admin", {
dbName: "nodejs",
useNewUrlParser: true,
});
console.log("몽고디비 연결 성공 ");
} catch (error) {
console.log("몽고디비 연결 에러 ", error);
}
};
mongoose.connection.on("error", (error) => {
console.error("몽고디비 연결에러", error);
});
mongoose.connection.on("disconnected", () => {
console.error("몽고디비와 연결이 끊어졌습니다. 연결을 재시도합니다");
connect();
});
module.exports = connect;
app.js
const express = require("express");
const path = require("path");
const morgan = require("morgan");
const nunjucks = require("nunjucks");
const connect = require("./schemas");
const exp = require("constants");
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((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"), "번 포트에서 대기중 ");
});
8.6.2 스키마 정의하기
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);
comment.js
'개발 도서 > Node.js 교과서' 카테고리의 다른 글
10 웹 API 서버 만들기 (0) | 2023.07.14 |
---|---|
09 익스프레스로 SNS 서비스 만들기 (0) | 2023.07.14 |
07 MySQL (0) | 2023.07.14 |
06 익스프레스 웹 서버 만들기 (0) | 2023.07.14 |
05 패키지 매니저 (0) | 2023.07.14 |