클라우드 컴퓨팅 & NoSQL/CouchBase

카우치베이스(Couchbase) 서버-#5 node.js를 이용하여 뷰를 호출하기

Terry Cho 2014. 7. 14. 00:28

Couchbase Server

#5. node.js를 이용하여 뷰를 호출하기

조대협 http://bcho.tistory.com


앞서 설명한 뷰를 node.js 카우치베이스 SDK를 이용해서 호출해보자, 

카우치베이스는 node.js와 몽고DB만큼이나 궁합이 잘 맞는 것 같다. 매우쉽게 뷰를 호출할 수 있다. 뷰 호출 메서드는

var viewQuery = bucket.view(“디자인도규먼트 이름”,”뷰 이름”,{옵션1:값,옵션2:값,…})

로 뷰쿼리를 생성한 후에, 

viewQuery.query(function(err,results){…} );

로 호출하면, 호출 성공시, 결과가 result 변수로 리턴된다.

그러면 간단한 예제를 보자. “mybucket”이라는 버킷이 있고, 안에 다음과 같은 데이타가 있다.

[ { id: 'user0002', key: [ 'us', '75', 'female' ], value: 1 },

  { id: 'user0004', key: [ 'us', '14', 'female' ], value: 1 },

  { id: 'user0003', key: [ 'us', '08', 'female' ], value: 1 },

  { id: 'user0001', key: [ 'korea', '75', 'male' ], value: 1 },

{ id: 'user0005', key: [ 'canada', '69', 'male' ], value: 1 } ]


뷰의 경로는 _desgin/dev_sample 디자인 도규먼트아래에, filter라는 이름으로 다음과 같이 정의되어 있다.


function (doc, meta) {

  var year = doc.ssn.substring(0,2);

  emit([doc.country,year,doc.sex],1);

}


이제, node.js와 Express 프레임웍을 이용해서, 이 뷰를 호출 하는 간단한, REST API를 만들어보자.

 

var express = require('express');

var routes = require('./routes');

var user = require('./routes/user');

var http = require('http');

var path = require('path');

var couchbase = require('couchbase');

 

var bucket = new couchbase.Connection({

    'bucket':'mybucket',

    'host':'127.0.0.1:8091'

},function(err){

    if(err){

        console.error('couchbase server connection error');

        throw err;

    }

})

var app = express();

 

// all environments

app.set('port', process.env.PORT || 3000);

app.set('views', path.join(__dirname, 'views'));

app.set('view engine', 'jade');

app.use(express.favicon());

app.use(express.logger('dev'));

app.use(express.json());

app.use(express.urlencoded());

app.use(express.methodOverride());

app.use(express.session({ secret: 'your secret here' }));

app.use(app.router);

app.use(express.static(path.join(__dirname, 'public')));

 

// development only

if ('development' == app.get('env')) {

  app.use(express.errorHandler());

}

 

app.get('/', routes.index);

app.get('/myview',function(req,res){

    console.log('myview');

    var viewQuery =  bucket.view('dev_sample','filter'

        ,{reduce:false,descending:true,startkey: [ 'us', '75', 'female' ],endkey:[ 'korea', '75', 'male' ]});

    viewQuery.query(function (err,results){

       console.log(results);

        console.log(typeof (results));

       if(err) {

            console.error(err);

       }else{

           res.send(results);

        }// else

    });

 

});

 

http.createServer(app).listen(app.get('port'), function(){

  console.log('Express server listening on port ' + app.get('port'));

});

 


앞부분에 카우치베이스를 연결하는 부분은 http://bcho.tistory.com/926 의 예제와 동일하다.

var viewQuery =  bucket.view('dev_sample','filter'

        ,{reduce:false,descending:true,startkey: [ 'us', '75', 'female' ],endkey:[ 'korea', '75', 'male' ]});

와 같이 뷰 쿼리를 만들었는데, 여기서 주목할 부분은 option 부분이다.

  • reduce:false로 하여, 리듀스함수를 실행하지 않고, 맵 함수만 수행하도록 하였으며
  • descending:true로 하여, 내림차원 정렬이 되도록 하였다.
  • startkey,endkey를 정의하여, 내림 차순으로 정리한 뷰에서 키의 값이 [‘us’,’75’,’female’]~[‘korea’,’75’,’female’]인 결과만 쿼리하도록 설정하였다.

다음으로 viewQuery.query(function (err,results){ 를 호출하여, 뷰쿼리를 호출한후에, 마지막으로 res.send(results); 를 이용하여 리턴된 결과값을 출력하였다.

※ 결과값은 JSON 도큐먼트로 리턴되기 때문에 바로 JSON 형태로 출력된다.

다음은 예제에 대한 실행 결과 화면이다.