基于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插件自动生成