- 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"));