관리 메뉴

진취적 삶

08 몽고디비 본문

개발 도서/Node.js 교과서

08 몽고디비

hp0724 2023. 7. 14. 11:45

몽고디비는 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