【翻译】C++操作MongoDB教程

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 【翻译】C++操作MongoDB教程

基于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

假设你有一个包含以下字段的集合:

  1. timestamp
  2. date
  3. time
  4. latitude
  5. longitude
  6. speed
  7. 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()方法可用于修改特定字段,替换整个现有文档,插入新文档或更新多个文档。

 

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 【翻译】C++操作MongoDB教程

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: