基于legacy驱动的C++ MongoDB教程。
版本:mongo-cxx-driver-legacy-1.1.2
开发参考API:https://mongodb.github.io/mongo-cxx-driver/api/legacy-1.1.2/
参考:http://www.bictor.com/2016/03/23/mongodb-c-tutorial/
下面开始本篇内容的教程。
大致的内容主要如下:
C++连接MongoDB
C++查询操作MongoDB
C++插入操作MongoDB
C++索引操作MongoDB
C++更新操作MongoDB
C++连接MongoDB
1:常规连接操作(不带密码连接)
mongo::DBClientConnection conn;
Mongo::Status status = mongo::client::initialize()
if (!status.isOK()) {
MongoException m(-1, “failed to initialize the client driver: ” + status.toString());
return -1
}
string url = “localhost:27017”;
if (!conn.connect(url, errmsg)) {
MongoException m(0, “couldn’t connect : ” + errmsg);
return -1;
}
通过上述代码,就会建立MongoDB的连接(未带权限的连接)
2:带密码连接
conn.auth(BSON( “user” << “root” << “db” << “mydatabase” << “pwd” << “password” << “mechanism” << “DEFAULT” ));
如果有密码,那么需要根据MongoDB的设置更改传递给函数conn.auth的参数值。
C++查询操作MongoDB
假设你有一个包含以下字段的集合:
- timestamp
- date
- time
- latitude
- longitude
- speed
- 
direction
为了查询操作,我们首先要构建查询语句,然后是执行查询操作,下面先看构建查询语句:
构建查询语句:
第一种:
查询内容:时间戳> 142400000,时间戳<142500000
mongo::Query b = MONGO_QUERY(“timestamp” << mongo::GT << (long long) 142400000 << “timestamp” << mongo::LT << (long long) 142500000);
第二种:
时间戳> 142400000和时间戳<142500000 按升序排序
mongo::Query b = MONGO_QUERY(“timestamp” << mongo::GT << (long long) 142400000 << “timestamp” << mongo::LT << (long long) 142500000);
第三种:
时间戳> 142400000和时间戳<142500000 按降序排列
mongo::Query b = MONGO_QUERY(“timestamp” << mongo::GT << (long long) 142400000 << “timestamp” << mongo::LT << (long long) 142500000); b.sort(“timestamp”, -1)
第四种:
匹配二进制数据,例如匹配字段description内容包含tag
string tag = “Binary”; mongo::BSONBinData be((void *) tag.c_str(), tag.length(), mongo::BinDataGeneral); mongo::Query b = MONGO_QUERY(“description” << be);
第五种:
匹配速度为0的所有参数
string tag = “Binary”; mongo::BSONBinData be((void *) tag.c_str(), tag.length(), mongo::BinDataGeneral); mongo::Query b = MONGO_QUERY(“timestamp” << mongo::GT << (long long) 142400000 << “timestamp” << mongo::LT << (long long) 142500000 <<“speed” << “0” << “description” << be); b.sort(“timestamp”, 1);
上面的查询语句就是查询内容:timestamp大于142400000 并且小于 142500000,speed等于0,description包含二进制内容Binary
构造好了查询语句,我们便可以执行查询语句了。
执行查询
现在我们已经进行了连接和查询语句构建,接下来我们将在服务器上执行这个查询。在这里我们将使用数据库“mydb”和集合名称“location”
string collectionName = “mydb.Locations”
auto_ptr<mongo::DBClientCursor> cursor = conn.query(collectionName,b);
mongo::BSONObj p;
while (cursor->more()) {
p = cursor->next();
// Do something with the fetched record
}
我们现在声明一个游标变量,它将返回指向以BSONObj格式格式化的记录的指针。 cursor-> more()检查是否有更多的行从服务器检索,如果是,我们调用cursor-> next()返回BSONObj对象。
如果我们只想查询N条记录
auto_ptr<mongo::DBClientCursor> cursor = conn.query(collectionName,b, 10);
为了检索N个记录,我们可以向查询函数传递附加参数,其中需要从服务器获取的记录数。这相当于SQL的WHERE语句中的LIMIT子句。
从返回的BSONOBJ获取我们需要的数据内容,所以完整的代码如下:
string collectionName = “mydb.Locations”
auto_ptr<mongo::DBClientCursor> cursor = conn.query(collectionName,b);
mongo::BSONObj p;
while (cursor->more()) {
p = cursor->next();
// Do something with the fetched record
double latitude = p.getField(“latitude”).Double();
double longitude = p.getField(“longitude”).Double();
}
在上述情况下,我们总是假定数据以集合中的Double格式插入。有时需要根据您的要求评估类型并执行转换。我们可以用下面的代码实现它。
double latitude;
while (cursor->more()) {
p = cursor->next();
// Do something with the fetched record
switch (p.getField(“latitude”)) {
case mongo::NumberDouble:
latitude = p.getField(“latitude”).Double();
break;
case mongo::String:
{
string lat = p.getField(“latitude”).String();
sscanf (lat.c_str(), “%lf”, &latitude);
}
break;
}
}
我们也可以查询某个集合有多少条记录:
cout << “count:” << conn.count(“mydb.Locations”) << endl;
C++插入操作MongoDB
将行插入MongoDB需要使用BSONObjBuilder。以下代码将说明在对象中添加4个字段,然后将其插入到集合中。
//Create BSONObjBuilder type Object
obj = new mongo::BSONObjBuilder();
//Append various fields and set their values
obj->append(“latitude”, 27.24424);
obj->append(“longitude”, 78.24242);
obj->append(“speed”, 0);
obj-appendBinData(“description”, 6, mongo::BinDataGeneral, “Binary”);
//Perform insertion command
conn.insert(dbCollection, obj->obj());
std::string e = conn.getLastError();
if (!e.empty()) {
MongoException m(1, “insert failed: ” + e);
return -1;
}
C++索引操作MongoDB
我们假设我们希望有一个年龄的索引,以便我们的查询很快。我们会用:
conn.createIndex(“mydb.Locations”, fromjson(“{timestamp:1}”));
在上面的例子中,我们使用一个新的函数fromjson。 fromjson将JSON字符串转换为BSONObj。这有时是指定BSON的方便方法。或者,我们可以写:
conn.createIndex(“mydb.Locations”, BSON( “timestamp” << 1 ));
在多次调用createIndex时,不会导致在服务器上创建重复的索引,这将为每个调用造成额外的网络往返和服务器操作。最好的做法是谨慎使用此方法,例如一次在代码开头,或者在外部设置脚本中为应用程序配置数据库。
C++更新操作MongoDB
使用update()方法执行数据库更新。例如mongo shell中的以下更新:
use tutorial
db.persons.update(
{ name : ‘Joe’, age : 33 },
{ $inc : { visits : 1 } }
)
那么在C++中操作MongoDB也是一样的语法:
db.update(“tutorial.persons”, BSON(“name” << “Joe” << “age” << 33), BSON(“$inc” << BSON( “visits” << 1)) );
update()方法可用于修改特定字段,替换整个现有文档,插入新文档或更新多个文档。
文章的脚注信息由WordPress的wp-posturl插件自动生成
 
                 微信扫一扫,打赏作者吧~
微信扫一扫,打赏作者吧~ 
	


![[原创]CentOS 6.5编译C++_MongoDB驱动](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2016/08/QQ截图20160801144415.png&w=280&h=210&zc=1)
