MongoDB 로 group 명령 사용하는 방법을 찾아봤습니다.
shell 에서 사용하는건 그리 어렵지 않은데..
C driver 용 bson object 만드는데 시행착오가 좀 있어서 이렇게 기록 해둡니다.
db.foo 에 a가 각각 abc, abcd, abcde 인 내용은 1개씩, a 가 123인 내용은 32개 들어있는 상황입니다.
MongoDB 용 구문은 이런데.. 이걸 C driver 로 쓰려면 이렇게 해야하네요..
shell 에서 사용하는건 그리 어렵지 않은데..
C driver 용 bson object 만드는데 시행착오가 좀 있어서 이렇게 기록 해둡니다.
db.foo 에 a가 각각 abc, abcd, abcde 인 내용은 1개씩, a 가 123인 내용은 32개 들어있는 상황입니다.
db.foo.group( { key : { a : 1 },
initial : { count : 0 },
$reduce : "function( obj, prev ) {prev.count++;} " } )
MongoDB 용 구문은 이런데.. 이걸 C driver 로 쓰려면 이렇게 해야하네요..
// MongoC-ClientTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winsock2.h"
#include "mongo.h"
int _tmain(int argc, _TCHAR* argv[])
{
// winsock 초기화
WSADATA wsaData;
WSAStartup( MAKEWORD(2, 2), &wsaData );
// mongo db 초기화
mongo m;
mongo_init( &m );
// local에 연결
int nRet = mongo_connect( &m, "127.0.0.1", 9000 );
if( nRet != MONGO_OK )
{
switch ( m.err )
{
case MONGO_CONN_SUCCESS: printf( "connection succeeded\n" ); break;
case MONGO_CONN_BAD_SET_NAME: printf( "bad arguments\n" ); return 1;
case MONGO_CONN_NO_SOCKET: printf( "no socket\n" ); return 1;
case MONGO_CONN_FAIL: printf( "connection failed\n" ); return 1;
case MONGO_CONN_NOT_MASTER: printf( "not master\n" ); return 1;
}
}
// group 명령 준비
bson bsonQuery;
bson_init( &bsonQuery );
bson_append_start_object( &bsonQuery, "group" ); // group 명령
bson_append_string( &bsonQuery, "ns", "foo" ); // collection 을 foo 로 지정
bson_append_start_object( &bsonQuery, "key" ); // key 는 "a"
bson_append_int( &bsonQuery, "a", 1 );
bson_append_finish_object( &bsonQuery );
bson_append_start_object( &bsonQuery, "initial" ); // group 할 초기값 설정
bson_append_int( &bsonQuery, "count", 0 );
bson_append_finish_object( &bsonQuery );
// reduce 함수 지정
bson_append_code( &bsonQuery, "$reduce", "function( obj, prev ) { prev.count++; }" );
bson_append_finish_object( &bsonQuery );
bson_finish( &bsonQuery );
// run command 수행
bson bsonOut;
bson_bool_t bRet = mongo_run_command( &m, "test", &bsonQuery, &bsonOut );
// 결과 출력
bson_print( &bsonOut );
// mongo db 정리
mongo_destroy( &m );
// winsock 정리
WSACleanup();
return 0;
}