mongoDB C++類對象使用


 

建立連接:

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]
 而更普遍的做法則是獲得BSONElement對象再取值:
     BSONElement  name = p [ "name" ];     //或者 BSONElement name = p.getField("name");
  std::string nameStr = name.str();    //各種不同數據類型的取值函數參見MongoDB 2.4.0 API Doc[BSONElement]

若要設置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"));

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM