mongoose?
- mongoose는 mongoDB를 ODM(object data mapping)방식으로 사용할수 있게 만든 node.js 패키지이다.
- schema based 로 model을 구성하게된다.
- caly에서는 모든 로그를 mongoDB로 관리하며, 웹 관리자 페이지가 node.js 웹서버로 되어있다. 로그는 우리 서비스의 움직임을 알아볼 수 있는 유일한 상황지표가 된다. 이를 의미있게 추출할 필요가 있었다.
설치
npm install mongoose
- 간단히 npm 으로 설치가 가능하다.
mongoose connection
- mongoDB에 연결을 해보자.
mongo.js
var mongoose = require('mongoose');
var dbconfig = require(__dirname+'/../config/db-config.json');
mongoose.connect('mongodb://'+dbconfig["mongoUser"]+':' + dbconfig["mongoPw"] + '@127.0.0.1/{DBname}?authSource=admin');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log('mono open')
});
exports._ = mongoose
- 위와같이 mongoose를 사용할 객체를 만들어준다.
- thread pool방식은 생략한다. 쉽게 찾아볼 수 있다.
- 우리는 이제 mongo._ 를 통해 mongoose의 객체에 접근할수있다.
- ._.는 정말 귀여운 코드표현이 아닐수 없다.
model
- mongoose는 기본 schema Base의 model을 만들어 사용한다.
- odm 인만큼 json data 폼에 맞춰 데이터를 만든다.
- 간단히 eventLog를 만들어보자
eventLogModel.js
var eventLog = new Schema(
{
_id:String,
label:String
},{ collection: '{collectionName}'}
);
exports.eventLog = mongo._.model({모델이름},eventLog);
- 위와같이 model을 만들었다. 콜렉션은 {collectionName} 에 명시해준다.
- 우리는 이 모델을 이용하여 몽고디비에 insert/find등의 작업을 하게 된다.
save
- {collectioName} eventLog셋 데이터를 넣어보자.
@@LogController.js
const eventLogModel = require(__dirname+'/../model/eventLogModel.js');
var eventLog = new eventLogModel({
label:"안녕하세요 이벤트로그 샘플이에요"
})
eventLog.save().then(function (doc){
console.log('saved data => ',doc)
}))
- 위와같이 간단히 save()함수를 이용하여 데이터를 넣을 수 있다.
- 경우에 따라 비동기 순차 작업을 위해 asyn await를 활용하는것이 좋다.(후에 포스팅)
find
- 위에서 입력한 정보를 찾아보자
eventLogModel.find({},function(err,data){
if (err) return handleError(err);
console.log('find all data => ',data)
})
- 간단히 find함수만으로 해당 정보를 가져올 수 있다.
- sql의 where 문처럼 다양한 조건을 주어서 조회(find({label:”123”})…)도 가능하다. 몽고디비 문서를 참고바란다.
마치며
- 크게 고민할 내용이 없다. 다만 필자가 mongoDB를 처음 제대로 사용하며 시간을 쏟은 부분이있다.
-
mongoose에서는 model안에 collectionName을 선언하지 않을경우 {모델이름} + s 를 붙여 데이터베이스를 만들어 insert하거나 find한다.
- 실제 필자는 collectionName옵션을 주고 사용하지 않다가 데이터가 조회가 안되는 이슈가 있었다. 바로 s가 자동으로 붙여져서 찾아지지 못하는 이유였다. 그러니 위와같이 collectionName을 명확히 표기해주는편이 보다 확실히 사용할 수 있을 것이다.
Comments