- 論壇徽章:
- 0
|
mongodb c++ 起步
本文是一篇轉(zhuǎn)載文章,文章內(nèi)容是在win下使用C++在官方提供的C++客戶端庫的基礎(chǔ)上操作MongoDB的例子,希望對廣大C++程序員在使用MongoDB上能有所幫助。
原文鏈接:http://blog.chinaunix.net/u/26524/showart_2147440.html
最近準備把空閑時間都發(fā)在mongodb的研究上,因此將有一系列的文章記錄這個過程。
直接從官網(wǎng)下載了1.2.1的windows32版本:
http://downloads.mongodb.org/win32/mongodb-win32-i386-1.2.1.zip
解壓之后寫了個runserver.bat文件:
E:\lenkydatasource\mongodb\1.2.1\mongodb-win32-i386-1.2.1\bin\mongod.exe --dbpath E:\lenkydatasource\mongodb\1.2.1\lenkytest\db --port 55555執(zhí)行該文件即可啟動mongodb服務(wù)程序。
解壓文件內(nèi)還包含了c++的頭文件和庫文件
E:\lenkydatasource\mongodb\1.2.1\mongodb-win32-i386-1.2.1\include
E:\lenkydatasource\mongodb\1.2.1\mongodb-win32-i386-1.2.1\lib
利用它們來寫mongodb客戶程序:
首先需要有boost,而mongodb-win32-i386-1.2.1.zip里提供的mongodb庫文件
E:\lenkydatasource\mongodb\1.2.1\mongodb-win32-i386-1.2.1\lib\mongoclient.lib此庫文件是用vs2008 + boost_1_35_0編譯出來的,懶得重新編譯mongodb,因此也對應(yīng)的使用vs2008 + boost_1_35_0編譯環(huán)境即可使用這個mongoclient.lib。
boost_1_35_0從boost官網(wǎng)下載即可。
編譯boost分兩步:
執(zhí)行E:\lenkydatasource\mongodb\1.2.1\boost_1_35_0\boost_1_35_0\tools\jam\build_dist.bat
將第一步生成的bjam.exe拷貝到E:\lenkydatasource\mongodb\1.2.1\boost_1_35_0\boost_1_35_0
然后執(zhí)行:
cd E:\lenkydatasource\mongodb\1.2.1\boost_1_35_0\boost_1_35_0
bjam.exe link=static threading=multi variant=release runtime-link=static --without-python --toolset=msvc-9.0完成后即會生成很多l(xiāng)ib庫,比如libboost_program_options-vc90-mt-gd-1_35.lib,把這些lib庫文件(搜索lib關(guān)鍵字)全部拷貝到E:\lenkydatasource\mongodb\1.2.1\boost_1_35_0\boost_1_35_0\uselib目錄(uselib目錄是我自己建立的)
接下來利用vs2008建立工程test,包含文件first.cpp,并做下設(shè)置:
1.工具–>選項–>項目和解決方案–>VC++ 目錄
加上對應(yīng)的包含文件:
E:\lenkydatasource\mongodb\1.2.1\boost_1_35_0\boost_1_35_0
E:\lenkydatasource\mongodb\1.2.1\mongodb-win32-i386-1.2.1\include\mongo
加上對應(yīng)的庫文件:
E:\lenkydatasource\mongodb\1.2.1\boost_1_35_0\boost_1_35_0\uselib
E:\lenkydatasource\mongodb\1.2.1\mongodb-win32-i386-1.2.1\lib
2.項目–>屬性(Alt+F7)–>配置屬性–>C/C++–>代碼生成–>運行時庫
選為多線程(/MT),即是靜態(tài)的,不要用DLL。
編譯執(zhí)行,結(jié)果:- time:10.797s
- insert finished
- time:0.453s
- query finished
- time:0.094s
- remove finished這個過程我遇到很多問題,一一解決后,正確流程就是上面這樣,也不知道遺漏了什么沒敘述沒有。
- first.cpp文件內(nèi)容:
- // first.cpp
- #include
- #include "client/dbclient.h"
- #pragma comment(lib, "mongoclient.lib")
- #pragma comment(lib, "wsock32.lib")
- using namespace std;
- int main( int argc, const char **argv ) {
- int i;
- clock_t start, finish;
- string errmsg;
- string table = "test.test";
- int record = 100000;
- mongo::DBClientConnection conn;
- // connect db server
- if (!conn.connect(string("127.0.0.1:55555"), errmsg)) {
- cout << "couldn't connect to server:" << errmsg << endl;
- return -1;
- }
- // insert test data
- start = clock();
- for (i = 0; i < record; i ++) {
- mongo::BSONObjBuilder query;
- query << "user" << i << "pwd" << i << "age" << i;
- query << "email" << i << "address" << i << "phone" << i;
- conn.insert(table, query.obj());
- }
- finish = clock();
- cout << "time:" << (double)(finish - start) / CLOCKS_PER_SEC << "s" << endl;
- cout << "insert finished" << endl;
- // query test data
- start = clock();
- {
- mongo::BSONObjBuilder query;
- //query.append("user" , 1);
- auto_ptr cursor = conn.query(table, query.obj());
- while (cursor->more()) {
- mongo::BSONObj obj = cursor->next();
- //cout << obj.jsonString() << endl;
- }
- }
- finish = clock();
- cout << "time:" << (double)(finish - start) / CLOCKS_PER_SEC << "s" << endl;
- cout << "query finished" << endl;
- // remove test data
- start = clock();
- {
- mongo::BSONObjBuilder query;
- //query.append("user" , 1);
- conn.remove(table, query.obj());
- }
- finish = clock();
- cout << "time:" << (double)(finish - start) / CLOCKS_PER_SEC << "s" << endl;
- cout << "remove finished" << endl; // waiting cin >> errmsg;
- return 0;
復制代碼 } |
|