MongoDB 2.0.0 Driver 사이트의 Using the Aggregation Framework 문서의 번역 자료입니다. 번역에 문제가 있다면 댓글 달아주시구요. 원문을 보시기를 추천드립니다.

Tutorial Contents

Using the Aggregation Framework

aggregation(집계) 프레임워크를 사용하면 그룹화(grouping), 요약(summations) 및 기타 operation을 documents로 변환하여 application에 리턴 할 수 있습니다. 프레임워크와 같은 매우 강력한 유닉스 파이프(unix pipe)입니다. 이 튜토리얼에서는 Collection class의 aggregate 메서드를 탐색하고 반복(iterate) 할 수 있는 커서를 리턴하는 데 사용되는 방법을 살펴 봅니다. 커서(cursor)는 본 튜토리얼에서는 다루지 않을 Node.js 0.10.x 스트림 인터페이스도 구현합니다. 스트림 및 Node.js 드라이버에 대한 자세한 내용은 Streams Tutorial을 참조하세요.

$match$sum의 결과를 반복하기 위해 커서(cursor)를 반환하는 간단한 예제부터 시작하겠습니다.

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

// Connection URL
var url = 'mongodb://localhost:27017/myproject';
// connect method 를 사용하여 서버에 연결
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);
  console.log("Connected correctly to server");

  var col = db.collection('aggregate');
  // Insert a single document
  col.insert([{a:1}, {a:1}, {a:1}], function(err, r) {
    assert.equal(null, err);
    assert.equal(3, r.length);

    // query에 일치하는 처음 두개의 documents를 가져옵니다.
    col.aggregate([
          {$match: {}}
        , {$group:
            {_id: '$a', total: {$sum: '$a'} }
          }
      ]).toArray(function(err, docs) {
      	assert.equal(null, err);
      	assert.equal(3, docs[0].total);
      	db.close();
    });
  });
});

aggregate 메서드를 커서로 실행할 때 MongoDB 2.6 이상에서는 서버의 aggregation 프레임워크에 네이티브 커서(native cursor) 지원이 사용됨을 이해해야합니다. 서버가 2.4 이하인 경우 가상 커서를 사용하여 커서 동작을 에뮬레이트(emulate)합니다. 콜백이 aggregate 명령에 포함 된 경우 첫 16MB의 결과를 반환하는 레거시 모드(legacy mode)로 대체됩니다.

aggregate 명령에 의해 리턴 된 커서에는 find 커서와 동일하게 사용 가능한 메소드 (즉, toArray, nexteach 메서드)가 있습니다.

우리는 이미 위의 toArray 메소드를 살펴 봤습니다. 다음 방법을 살펴 보겠습니다.

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

// Connection URL
var url = 'mongodb://localhost:27017/myproject';
// connect method 를 사용하여 서버에 연결
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);
  console.log("Connected correctly to server");

  var col = db.collection('aggregate');
  // Insert a single document
  col.insert([{a:1}, {a:1}, {a:1}], function(err, r) {
    assert.equal(null, err);
    assert.equal(3, r.length);

    // query에 일치하는 첫 두개의 documents를 가져옵니다.
    col.aggregate([
          {$match: {}}
        , {$group:
            {_id: '$a', total: {$sum: '$a'} }
          }
      ]).next(function(err, doc) {
      	assert.equal(null, err);
      	assert.equal(3, doc.total);
      	db.close();
    });
  });
});

next 메서드는 application이 콜백을 사용하여 한 번에 하나의 documents를 읽을 수 있도록합니다. 다음에 each 메서드를 살펴 보겠습니다.

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

// Connection URL
var url = 'mongodb://localhost:27017/myproject';
// connect method 를 사용하여 서버에 연결
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);
  console.log("Connected correctly to server");

  var col = db.collection('aggregate');
  // Insert a single document
  col.insert([{a:1}, {a:1}, {a:1}], function(err, r) {
    assert.equal(null, err);
    assert.equal(3, r.length);

    // query에 일치하는 첫 두개의 documents를 가져옵니다.
    col.aggregate([
          {$match: {}}
        , {$group:
            {_id: '$a', total: {$sum: '$a'} }
          }
      ]).each(function(err, doc) {
        if(doc) {
          db.close();
          // document를 가져오고 each를 종료합니다.
          return false;
        }
    });
  });
});

each 메서드는 쿼리를 만족하는 documents가 더 이상 없을 때까지 제공된 콜백을 호출합니다. 사용 가능한 documents가 소진되면(exhausted) 콜백의 두 번째 매개 변수에 대해 null을 반환합니다. 각각을 일찍 종료하려면 each callback에서 false를 반환해야합니다. 커서가 document를 반환하지 않습니다.

Node.js MongoDB 드라이버의 aggregation 지원이 포함됩니다.