- Getting Started with the C++ Driver
- SQL to mongo Shell to C++ (重要,必看!)
- C++ BSON Helper Functions
- C++ BSON Array Examples
建立連接:
try { mongo::DBClientConnection c; c.connect("localhost"); std::cout << "connected ok" << std::endl; } catch( const mongo::DBException &e ) { std::cout << "caught " << e.what() << std::endl; }
插值
往數據庫中保存數據必須創建BSONObj類的對象,BSONObj下各組件都可以叫做BSONElement對象。使用BSONObjBuilder構造各種BSON對象,用BSONObjIterator來遍歷各BSON對象。
以下構造的BSON對象——“person”包含有name和age,我們這樣調用:
BSONObjBuilder b; b.append("name", "Joe"); b.append("age", 33); BSONObj p = b.obj();
更簡明的方式是:
BSONObj p = BSONObjBuilder().append("name", "Joe").append("age", 33).obj();
還可以使用stream-oriented語法:
BSONObjBuilder b; b << "name" << "Joe" << "age" << 33; BSONObj p = b.obj();
而使用宏BSON則是最緊湊的:
BSONObj p = BSON( "name" << "Joe" << "age" << 33 );
通過使用GENOID 這個helper標記可以為對象增加一個object id。 GENOID (產生mongo::IOD類型值)字段是可選,若沒有顯式列出,服務端插入時會自動增加一個_id字段:
BSONObj p = BSON( GENOID << "name" << "Joe" << "age" << 33 ); // result is: { _id : ..., name : "Joe", age : 33 }
若是使用non-stream構建語法創建,則GENOID應放在生成對象的開始位置:
BSONObj p = BSONObjBuilder().genOID().append("name","Joe").append("age",33).obj();
構建后即可將person BSON對象這樣插入persons collection:
c.insert("tutorial.persons", p);
以下代碼獲取persons collection的所有對象,並逐一顯式
cout << "count:" << c.count("tutorial.persons") << endl; //先輸出對象數量 auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", BSONObj()); //一個空的BSON對象 while (cursor->more()) cout << cursor->next().toString() << endl;
BSONObj() 指代一個空BSON對象——即表示{},而query條件為空即表示搜索全表。
使用BSONObj::toString可獲得關於對象的概要JSON String,要想獲得完整輸出,應用BSONObj::jsonString,獲得單個字段的字符串類型的值則使用
.getStringField("name"),函數原型及相關可參見MongoDB 2.4.0 API Doc[BSONObj]。
若要設置query條件,可如下構造一個QUERY類對象:
auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", QUERY("age" << age ));
排序
進一步若要使返回的結果集按name的字母序排序,則可通過使用Query::sort()來給query表達式增加一個更改項(modifier):
auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", QUERY("age" << age ).sort("name"));
索引
若想用age字段作為索引,來加速查詢,則可以這樣:
c.ensureIndex("tutorial.persons", fromjson("{age:1}"));
ensureIndex會先做同樣的索引存在檢測,若無則創建。ensureIndex是智能的,不會向服務端重復發送,因而就算多次調用它也是安全的。
fromjson函數用於把JSON String轉換為BSON String,某些情況下這種方式指定BSON更方便。
而用BSON宏的方式則為:
c.ensureIndex("tutorial.persons", BSON( "age" << 1 ));
修改
通過使用Update()方法修改數據庫(將name為Joe者的age改為33、visits字段值增1):
c.update("tutorial.persons", BSON("name" << "Joe" << "age" << 33), BSON("$inc" << BSON( "visits" << 1)));
再舉一例:
SQL原型為: UPDATE users SET a=a+2 WHERE b='q'
對應 Mongo Shell: db.users.update({b:'q'}, {$inc:{a:2}},false,true)
C++代碼:
c.update("mydb.users", QUERY("b"<<"q"), BSON("$inc"<<BSON("a"<<2)), false, true); //最后兩項表示是否upsert、是否批修改 // optionally: string err = c.getLastError(); bool ok = err.empty();
刪除
使用remove()刪除文檔:
c.remove("tutorial.persons", QUERY("name"<<"Tim"));