Node.js 교과서 8장을 공부하고

⚠️ 본 포스팅은 매주 Node.js를 공부하고, 동아리 스터디원들과 함께 스터디한 내용을 정리하는 곳입니다.

⚠️ 모든 내용을 기록하려고 하기 보다는 함축하고 필요한 내용만 작성하고 있습니다.

https://github.com/gilbutITbook/080229

8 MongoDB

NoSQL vs. SQL

  • 고정된 테이블이 없고 자유로운 데이터 입력이 가능
  • 확장성과 가용성, 속도
  • 컬렉션 간 JOIN을 지원하지 않음 (비슷하게는 가능)

MongoDB CRUD

Create

컬렉션에 컬럼을 정의하지 않아도 되므로 컬렉션에는 아무 데이터나 넣을 수 있다.

이것은 몽고디비의 장점이기도 하지만 무엇이 들어올지 모른다는 것이 단점이기도 하다.

  • 다큐먼트 생성
> db.컬렉션명.save(다큐먼트)

Read

  • 다큐먼트 조회
> db.컬렉션명.find({});
  • 특정 필드만 조회
> db.컬렉션명.find({}, {_id:0, name:1, married: 1});
  • gt 특수 속성 사용하기
> db.users.find({ age: {$gt: 30}, married: true}, {_id:0, name: 1, age: 1});
  • 몽고디비 or 연산
> db.users.find({ $or: [{ age: {$gt: 30}}, {married: false}]}, {_id: 0, name: 1, age: 1});
  • 정렬
> db.users.find({}, {_id: 0, name: 1, age: 1}).sort({ age: -1})
  • 조회할 다큐먼트 개수 설정
> db.users.find({}, {_id: 0, name: 1, age: 1}).sort({ age: -1 }).limit(1)
  • 다큐먼트 개수를 설정하면서 몇 개를 건너뛸지 설정할 수 있다.
> db.users.find({}, {_id: 0, name: 1, age: 1 }).sort({ age: -1}).limit(1).skip(1)

Update

> db.users.update({ name: 'nero' }, { $set: { comment: '안녕하세요. 수정한 필드입니다.' } });

Delete

> db.users.remove({ name: 'nero' })

Mongoose

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;

몽고디비를 연결 및 연결 확인

users.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,
    createAt: {
        type:Date,
        default: Date.now,
    },
});
module.exports = mongoose.model('User',userSchema);

user 컬렉션 name, age, married, comment, comment, createAt

comment.js

const mongoose = require('mongoose');

const { Schema } = mongoose;
const { Types:{ ObjectId }} = Schema;
const commentSchema = new Schema({
    commenter:{
        type: ObjectId,
        required: true,
        ref: 'User',    //commenter 필드에 User 스키마의 사용자 ObjectId가 들어감
    },
    comment:{
        type: String,
        required: true,
    },
    createAt:{
        type: Date,
        default: Date.now,
    },
});
module.exports = mongoose.model('Comment',commentSchema);

comment 컬렉션 commenter, comment, createAt