이것도 결국엔 bson 이용 방법이 문제인데

정말 bson 이 익숙해지면 mongodb 사용은 거의 끝이 날 것 같네요..

 

void mongo_bson_test_time_t( mongo& m ) 
{
//	> db.foo.find()
//	{ "_id" : ObjectId("4f26266439584a7aa0bfce4e"), 
//	  "time" : ISODate("2012-01-30T05:11:00.594Z") }
//
// time 의 값을 time_t 로 읽어서 출력하기

	mongo_cursor cursor;

	mongo_cursor_init( &cursor, &m, "test.foo" );			// collection 을 test.foo 로 지정

	while( mongo_cursor_next( &cursor ) == MONGO_OK ) 
	{
		bson_iterator iterator;

		// time 필드의 값 읽어오기
		if ( bson_find( &iterator, mongo_cursor_bson( &cursor ), "time" ) )
		{
			time_t t = bson_iterator_time_t( &iterator );

			printf( "time: %s\n", ctime( &t ) );
		}
	}

	mongo_cursor_destroy( &cursor );
}


MongoDB 로 group 명령 사용하는 방법을 찾아봤습니다.

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;
}


2011년 12월 3일에 있었던 제2회 온라인서버제작자모임 공개강연회에서 발표한 자료입니다.



뭔가 좀 써보려고 했는데, 너무 잘 정리되어 있음 ㅋ

http://www.mongodb.org/display/DOCSKR/Quickstart+Windows

+ Recent posts