코딩 발걸음 - 한발두발개발

Mongoose를 이용한 CRUD 본문

개발/데이터베이스

Mongoose를 이용한 CRUD

한발두발개발 2021. 7. 2. 18:58
728x90

기본 스키마 정의

 

http Request 를 이용하여 mongoDB에 CRUD 테스트를 해보겠습니다.

 

1. CREATE = save (AutoIncrement 사용)

var mongoose = require('mongoose');

//*mongoose autoincrement 모듈 사용 npm install mongoose-auto-increment
var autoincrement = require('mongoose-auto-increment');
autoincrement.initialize(mongoose.connection);

//mongoose 스키마 객체 정의
var userSchema = new mongoose.Schema(
  {
      //AutoIncrement를 이용하여 seq에 데이터를 넣을 예정 기본값 0
      seq : Number,
      user_id : String,
      user_name : String,
      user_age : Number,
      //now date 를 넣기 위해 기본적으로 아래 주석 처럼 쓰긴하나
      //request_time : {type : Date , Default : Date.now() }
      //보기 좋은 Date 형태를 위해 String으로 정의하여 date를 Format하여 넣을 예정
      request_time : String
  },
  {
      //mongoose를 이용하여 데이터를 insert하면 자동적으로 __v 라는 컬럼이 생김
      //versionKey : false를 사용하면 나오지 __v라는 컬럼이 생기지 않는다.
      versionKey: false
  }
);

//auto-increment 스키마 객체 정의
var autoField = {
    //적용할 모델 명
    model : 'user_history',

    //적용할 컬럼
    field : 'seq',

    //시작할 num
    startAt : 1,

    //증가할 num
    increment : 1,
};

//정의한 키마에 autoincrement스키마 플러그인
userSchema.plugin(autoincrement.plugin, autoField);

//data 객체 정의
var data = {
    user_id : req.query.user_id,
    user_name : req.query.user_name,
    user_age : req.query.user_age,
    request_time : getFormatDate(new Date())
};

//param 부분 다시 알아봐야함
//param 1. 모델명 - 기본적으로 컬렉션을 복수형으로 생성하지만 생성하기 싫으면 param3의 collection명을 지정해줘야 함
//param 1. 예) param3에서 컬렉션명을 지정하지 않을 경우 'user_history -> user_histories'로 컬렉션을 생성하고 create함

//param 2. 적용할 스키마
//param 3. collection명
//mongoose를 이용한 user_history객체 생성

var userHistory = mongoose.model('user_history', userSchema,'user_history');

var doc = new userHistory(data);

//save함수로 iunsert를 한다.
//http://localhost:8913/insertUserHistory?user_id=test123&user_name=홍길동&user_age=45 일 경우
//mongoDB Query : db.login_history.insert({ seq : seq, user_id : 'test123' , user_name : '홍길동', user_age :NumberInt(45) , request_time : request_time})
//mysql Query : INSERT INTO db.login_history(seq, user_id, user_name, user_age, request_time) VALUES(seq, user_id, user_name, user_age, request_time)
doc.save(function (err, result) {
    if (err) {
    	console.log(err); 
    } else {
    	console.log(result); 
    }
});


//date format 출처 : https://developer0809.tistory.com/74
function getFormatDate (date) {

    let year = date.getFullYear();
    let month = date.getMonth() + 1; 
    month = month >= 10 ? month : '0' + month;
    let day = date.getDate();
    day = day >= 10 ? day : '0' + day;
    let hour = date.getHours();
    hour = hour >= 10 ? hour : '0' + hour;
    let min = date.getMinutes();
    let sec = date.getSeconds();
    sec = sec >= 10 ? sec : '0' + sec;

    let purchaseDay = year + '-' + month + '-' + day + ' ' + hour + ':' + min + ':' + sec;

    return purchaseDay;
}

 

2. READ = find()

var mongoose = require('mongoose');

//mongoose 스키마 객체 정의
var userSchema = new mongoose.Schema(
  {
      //AutoIncrement를 이용하여 seq에 데이터를 넣을 예정 기본값 0
      seq : Number,
      user_id : String,
      user_name : String,
      user_age : Number,
      //now date 를 넣기 위해 기본적으로 아래 주석 처럼 쓰긴하나
      //request_time : {type : Date , Default : Date.now() }
      //보기 좋은 Date 형태를 위해 String으로 정의하여 date를 Format하여 넣을 예정
      request_time : String
  },
  {
      //mongoose를 이용하여 데이터를 insert하면 자동적으로 __v 라는 컬럼이 생김
      //versionKey : false를 사용하면 나오지 __v라는 컬럼이 생기지 않는다.
      versionKey: false
  }
);

//get으로 받은 데이터
var user_id = req.query.user_id;
var user_age = req.query.user_age;
var user_name = req.query.user_name;

//조건 객체 생성
var fWhere = { 
	user_id : {$regex : '.*' + user_id + '.*'}
};

//param 부분 추가 공부
//param 1. 모델명
//param 2. 적용할 스키마
//param 3. collection명
//mongoose를 이용한 userHistory객체 생성
var userHistory = mongoose.model('user_history', userSchema,'user_history');


//param 1. 조건
//param 2. callback
//http://localhost:8913/findUserHistory?user_id=test123
//mogoDB Query : db.user_history.find({ user_id: { '$regex': '.*abc.*' } })
//MySQL Query : SELECT * FROM db.user_history WHERE user_id LIKE '%abc%'
userHistory.find( fWhere, function (err, result) {
    if (err) {
    	console.log(err);
    } else {
    	console.log(result);
    }
});

 

 

3. UPDATE = updateMany() , updateOne()

var mongoose = require('mongoose');

//mongoose 스키마 객체 정의
var userSchema = new mongoose.Schema(
  {
      //AutoIncrement를 이용하여 seq에 데이터를 넣을 예정 기본값 0
      seq : Number,
      user_id : String,
      user_name : String,
      user_age : Number,
      //now date 를 넣기 위해 기본적으로 아래 주석 처럼 쓰긴하나
      //request_time : {type : Date , Default : Date.now() }
      //보기 좋은 Date 형태를 위해 String으로 정의하여 date를 Format하여 넣을 예정
      request_time : String
  },
  {
      //mongoose를 이용하여 데이터를 insert하면 자동적으로 __v 라는 컬럼이 생김
      //versionKey : false를 사용하면 나오지 __v라는 컬럼이 생기지 않는다.
      versionKey: false
  }
);

//get으로 받은 데이터
var user_id = req.query.user_id;
var user_age = req.query.user_age;
var user_name = req.query.user_name;

//조건 객체 생성
var uWhere = {
    user_id : user_id,
    //gt : 초과, gte : 이상, lt : 미만, lte : 이하
    user_age : {$gte : user_age}
};

//변경값 객체 생성
var uSet = {
    user_name : user_name,
    request_time : getFormat(new Date())
};

//param 부분 다시 알아봐야함
//param 1. 모델명
//param 2. 적용할 스키마
//param 3. collection명
//mongoose를 이용한 userHistory객체 생성
var userHistory = mongoose.model('user_history', userSchema,'user_history');


//updateOne() = 최초발견 하나만 업데이트
//updateMany() = 여러개 삭제
//param 1. 조건 값
//param 2. 업데이트 값
//param 3. callback
 
//http://localhost:8913/updateUserHistory?user_id=test123&user_age=45&user_name=김변경 일 경우
//mogoDB Query : db.user_history.updateMany({user_id : 'test123' , user_age : {$gte : 45}},{$set : {user_name : '김변경'}})
//MySQL Query : UPDATE db.user_history SET user_name = '김변경', request_time = request_time WHERE user_id LIKE 'test123' AND user_age >= 45
//참고로 mongodb 내에서 update쿼리를 사용할 때 $set을 사용하지 않을 경우 user_name이 김변경으로 변경 되고 나머지 컬럼값이 삭제 되니 주의하셔야 합니다.
userHistory.updateMany(uWhere,uSet,function (err, result) {
    if (err) {
    	console.log(err);
    }
    else {
    	console.log(result);
    }
});


//date format 출처 : https://developer0809.tistory.com/74
function getFormatDate(date){
  let year = date.getFullYear();
  let month = date.getMonth() + 1; 
  month = month >= 10 ? month : '0' + month;
  let day = date.getDate();
  day = day >= 10 ? day : '0' + day;
  let hour = date.getHours();
  hour = hour >= 10 ? hour : '0' + hour;
  let min = date.getMinutes();
  let sec = date.getSeconds();
  sec = sec >= 10 ? sec : '0' + sec;
  
  let purchaseDay = year + '-' + month + '-' + day + ' ' + hour + ':' + min + ':' + sec;

  return purchaseDay;
}

 

 

4. DELETE = deleteOne(), deleteMany()

var mongoose = require('mongoose');

//mongoose 스키마 객체 정의
var userSchema = new mongoose.Schema(
  {
      //AutoIncrement를 이용하여 seq에 데이터를 넣을 예정 기본값 0
      seq : Number,
      user_id : String,
      user_name : String,
      user_age : Number,
      //now date 를 넣기 위해 기본적으로 아래 주석 처럼 쓰긴하나
      //request_time : {type : Date , Default : Date.now() }
      //보기 좋은 Date 형태를 위해 String으로 정의하여 date를 Format하여 넣을 예정
      request_time : String
  },
  {
      //mongoose를 이용하여 데이터를 insert하면 자동적으로 __v 라는 컬럼이 생김
      //versionKey : false를 사용하면 나오지 __v라는 컬럼이 생기지 않는다.
      versionKey: false
  }
);

//get으로 받은 데이터
var user_id = req.query.user_id;
var user_name = req.query.user_name;

//조건 객체 생성
var dWhere = {
  user_id : user_id,
  user_name : user_name
};

//param 부분 다시 알아봐야함
//param 1. 모델명
//param 2. 적용할 스키마
//param 3. collection명
//mongoose를 이용한 userHistory객체 생성
var userHistory = mongoose.model('user_history', userSchema,'user_history');


//deleteOne() = 최초발견 하나만 삭제
//deleteMany() = 여러개 삭제
//param 1. 조건 값
//param 2. 업데이트 값
//param 3. callback
 
//http://localhost:8913/deleteUserHistory?user_id=abc123&user_name=황태은 일 경우
//mogoDB Query : db.user_history.deleteMany({ user_id: 'abc123', user_name: '황태은' })
//MySQL Query : DELETE FROM db.user_history WHERE user_id LIKE 'abc123' AND  user_name LIKE '황태은'
userHistory.deleteMany(dWhere,function (err, result) {
    if (err) {
    	console.log(err);
    } else {
    	console.log(result);
    }
});