2015년 6월 18일 목요일

MongoDB에서 최고값 가져오기 with C (SQL의 MAX와 동일)

최고값 구하는거때매 한참 해맸네. 뭔가 지원되겠거니 편해볼라고 기대한 내 잘못이지;;

case SQL:
SELECT MAX(sid) FROM {TABLE NAME};

case MongoDB:
 
#include <bson.h>
#include <mongoc.h>

#define MGDOID "sid"

// MongoDB에서 최고값 가져오기
unsigned long GetMaxFromMongoDB()
{
 mongoc_client_t *client;
 mongoc_collection_t *collection;
 mongoc_cursor_t *cursor;

 bson_t *pipeline;
 bson_iter_t iter;
 const bson_t *doc;
 const bson_value_t *value;

 unsigned long ans;
 
 // for debug
 clock_t cStartClock;
 cStartClock = clock();

 //mongoDB 초기화
 mongoc_init();
 client = mongoc_client_new(MONGO_SERVER);

 if (!client) {
  fprintf(stderr, "[MongoDB] Failed to parse URI.\n");
  return 0;
 }

  //MongoDB - Collection 연결
 collection = mongoc_client_get_collection (client, MONGO_DBNAME, MONGO_COLLECTION);

 pipeline = BCON_NEW ("pipeline", "[",
      "{", "$project", "{", MGDOID, BCON_INT32(1), "}", "}",
      "{", "$sort", "{", MGDOID, BCON_INT32(-1), "}", "}",
   "{", "$limit", BCON_INT32(1), "}",
   "]");

 cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL);
 
 while (mongoc_cursor_next(cursor, &doc)) {
  if(bson_iter_init(&iter, doc)) {
   while (bson_iter_next(&iter)) {
    if( strncmp(bson_iter_key(&iter), MGDOID, 3) == 0) {
     value = bson_iter_value (&iter);
//fprintf(stderr, "[%" PRId64 "]\n", value->value.v_int64);
     ans = (long)value->value.v_int64;
    }
   }
  }
 }
 bson_destroy(pipeline);

 mongoc_collection_destroy (collection);
 mongoc_client_destroy (client);
 mongoc_cleanup();

 cStartClock = (clock() - cStartClock);
 fprintf(stderr, "> GET MAX ID From MongoDB[%ld]: %2.8f sec.\n", ans, cStartClock / (double)CLOCKS_PER_SEC);

 return ans;
}


댓글 없음:

댓글 쓰기