一、连接类

  DBClientConnection,派生自DBClientBase。DBClientBase类是实现query, update, insert, remove等功能。

  构造函数:DBClientConnection(bool _autoReconnect=false, DBClientReplicaSet* cp=0, double so_timeout=0)

    _autoReconect是否自动重连,默认false

    cp不需要关心,默认值

    so_timeout超时时间,单位是秒

  连接函数:bool connect(const char *hostname, string &errmsg)

    hostname 主机,127.0.0.1,127.0.0.1:5555

    errmsg 错误信息,传出

二、删除文档

  void remove(const string &ns, Query q, bool justOne=0)

    ns 库名.集合名

    q 是一个查询条件。Query是一个类,利用构造函数Query(const char *json);构造。

    justOne 是否删除一条,默认false

三、新增文档

  void insert(const string &ns, BSONObj obj, int flag=0)

    ns 库名.集合名

    BSONObj obj:

      1、通过BSONObjBuilder构造

        

 //通过BSONObjBuilder.obj()生成BSONObj

 //第一种形式
BSONObjBuilder b1;
//{id:1,name:'haha'}
b1.append("id",);
b1.append("name","haha");
/*
BSONObj obj() {
bool own = owned();
massert( 10335 , "builder does not own memory", own );
doneFast();
BSONObj::Holder* h = (BSONObj::Holder*)_b.buf();
decouple(); // sets _b.buf() to NULL
return BSONObj(h);
}
*/
DBClientConnection.insert("dbName.collectionName",b1.obj()); //第二种形式
BSONObjBuilder b2;
//{id:2,name:'hehe'}
/*
template<class T>
BSONObjBuilder& operator<<( T value );
*/
b2<<"id"<<<<"name"<<"hehe";
//余下同上 //第三种形式
/*
#define BSON(x) (( mongo::BSONObjBuilder(64) << x ).obj())
*/
//{id:3,name:'hahe'}
BSONObjBuilder b3=BSON("id"<<<<"name"<<hahe");

      2、通过Query构造

        

 //{id:4,name:'heha'}
Query ins("{id:4,name:'heha'}");
/*
class Query {
public:
BSONObj obj;
Query() : obj(BSONObj()) { }
Query(const BSONObj& b) : obj(b) { }
Query(const string &json);
Query(const char * json);
*/
insert("dbName.collectionName",ins.obj);

四、修改文档

  void update(const string &ns, Query query, BSONObj obj, bool upsert = false, bool multi = false);

  ns 库名.集合名

  query 查询的条件

  obj 更新的内容

  upsert 如果条件不成立是否新增

  multi 是否更新多条

  

 //查询条件
Query query("{id:1}");
//更新内容
Query bobj("{name:'hehe'}");
update("dbName.collectionName",query,bobj.obj);

五、查询文档

  virtual auto_prt<DBClientCursor> query(const string &ns, Query query=Query(), int nToReturn =0, int nToSkip=0, const BSONObj *fieldsToReturn=0, int queryOptions=0, int batchSize=0)

  auto_prt<DBClientCursor> 智能指针,自动释放<>内部的内存数据

    DBClientCursor类,存放查询结果。more()判断调用next是否安全。next()返回BSONObj对象

      DBClientCursor部分源码:

/** Queries return a cursor object */
class DBClientCursor : public DBClientCursorInterface {
public:
/** If true, safe to call next(). Requests more from server if necessary. */
bool more(); /** If true, there is more in our local buffers to be fetched via next(). Returns
false when a getMore request back to server would be required. You can use this
if you want to exhaust whatever data has been fetched to the client already but
then perhaps stop.
*/
int objsLeftInBatch() const { _assertIfNull(); return _putBack.size() + batch.nReturned - batch.pos; }
bool moreInCurrentBatch() { return objsLeftInBatch() > ; } /** next
@return next object in the result cursor.
on an error at the remote server, you will get back:
{ $err: <string> }
if you do not want to handle that yourself, call nextSafe().
*/
BSONObj next();

    ns,query  同前

    nToReturn 返回记录数

    nToSkip 跳过记录数

    fieldsTOReturn 要返回的字段

DBClientConnection conn(false,,);
std::string errmsg;
if (!conn.connect("localhost:27018", errmsg))
{
cout << "connect to mongo err" << endl;
return -;
}
auto_ptr<DBClientCursor> cursor = conn.query("dbName.collectionName", Query("{}"));

    读取查询结果:

      BSONObj重载了<<

        部分源码:

inline std::ostream& operator<<( std::ostream &s, const BSONObj &o ) {
return s << o.toString();
} inline std::string BSONObj::toString( bool isArray, bool full ) const {
if ( isEmpty() ) return "{}";
StringBuilder s;
toString(s, isArray, full);
return s.str();
} inline void BSONObj::toString( StringBuilder& s, bool isArray, bool full, int depth ) const {
if ( isEmpty() ) {
s << "{}";
return;
} s << ( isArray ? "[ " : "{ " );
BSONObjIterator i(*this);
bool first = true;
while ( ) {
massert( , "Object does not end with EOO", i.moreWithEOO() );
BSONElement e = i.next( true );
massert( , "Invalid element size", e.size() > );
massert( , "Element too large", e.size() < ( << ) );
int offset = (int) (e.rawdata() - this->objdata());
massert( , "Element extends past end of object",
e.size() + offset <= this->objsize() );
e.validate();
bool end = ( e.size() + offset == this->objsize() );
if ( e.eoo() ) {
massert( , "EOO Before end of object", end );
break;
}
if ( first )
first = false;
else
s << ", ";
e.toString( s, !isArray, full, depth );
}
s << ( isArray ? " ]" : " }" );
}

      读取指定字段内容

        BSONObj::getField(const StringData& name)

        源码:

inline BSONElement BSONObj::getField(const StringData& name) const {
BSONObjIterator i(*this);
while ( i.more() ) {
BSONElement e = i.next();
if ( strcmp(e.fieldName(), name.data()) == )
return e;
}
return BSONElement();
}

        BSONElement部分源码:

class BSONElement {
public:
/** These functions, which start with a capital letter, throw a UserException if the
element is not of the required type. Example: std::string foo = obj["foo"].String(); // std::exception if not a std::string type or DNE
*/
std::string String() const { return chk(mongo::String).valuestr(); }
Date_t Date() const { return chk(mongo::Date).date(); }
double Number() const { return chk(isNumber()).number(); }
double Double() const { return chk(NumberDouble)._numberDouble(); }
long long Long() const { return chk(NumberLong)._numberLong(); }
int Int() const { return chk(NumberInt)._numberInt(); }
bool Bool() const { return chk(mongo::Bool).boolean(); }
std::vector<BSONElement> Array() const; // see implementation for detailed comments
mongo::OID OID() const { return chk(jstOID).__oid(); }
void Null() const { chk(isNull()); } // throw UserException if not null
void OK() const { chk(ok()); } // throw UserException if element DNE

        读取的字段不存在,程序会出现异常,需要调用hasField(char*)或者hasElement(char*)判断是否有该元素

       示例

while (cursor->more())
{//判断是否有下一条
mongo::BSONObj obj = cursor->next();//取下一条记录,为BSONObj格式
//cout << obj << endl;
//解析数据
cout << "id:" << obj.getField("id").Number() << ",name:" << obj.getField("name").String();
if (obj.hasElement("age"))
{//是否存在该元素
cout << ",age:" << obj.getField("age").Number();
} cout << endl;
}

[笔记]MongoDB 二(Linux下MongoDB API C++编程)的更多相关文章

  1. MongoDB在Linux下常用优化设置

    MongoDB在Linux下常用优化设置 以下是一些MongoDB推荐的常用优化设置.在生产环境下选取合适的参数值,例如预读值和默认文件描述符数目等,会对系统性能有很大的影响. 1.关闭数据库文件的 ...

  2. Linux下mongodb安装及数据导入导出教程

    Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...

  3. Linux下MongoDB服务安装

    Linux下MongoDB服务安装 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据 ...

  4. Linux下mongodb

    Linux下mongodb安装: 新建mongodb文件夹 下载安装包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3. ...

  5. MongoDB在linux下的启动

    最近公司数据库用到MongoDB,而之前只关注知道它是分布式非关系数据库,数据以文档的形式存储,数据格式是类似json的bson格式.而对于具体用法以及java如何调用并没有过多接触,今天花费一天的时 ...

  6. Java web与web gis学习笔记(二)——百度地图API调用

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  7. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  8. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  9. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

随机推荐

  1. P4942小凯的数字

    给定一个序列,如12345 56789 1011121314等,输出对其取余9的结果. 那么我们需要明白一个定理,一个序列对一个数的取余结果等于它各位之和取余那个数的结果.证明似乎是这样∑i=0n​a ...

  2. 集成学习-Boosting 模型深度串讲

    首先强调一下,这篇文章适合有很好的基础的人 梯度下降 这里不系统讲,只介绍相关的点,便于理解后文 先放一个很早以前写的 梯度下降 实现 logistic regression 的代码 def tidu ...

  3. C#中static修饰符的作用

    static在C#中表示的是静态的,比如一个静态的字段是归类型所有,而非归对象所有,也就是说,在调用这个字段时,只能用类型去调,而不能用对象. 实例字段时随着对象创建而创建,对象销毁而销毁,而静态字段 ...

  4. 磁盘(disk)结构

  5. SpringBoot:spring boot使用Druid和监控配置

    Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能. Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource 业 ...

  6. linux使用VNC服务轻松远程安装oracle

    VNC服务在远程服务器上安装oracle,新手安装oracle时总会遇到这样或者那样的问题,下面我就详细解说一下安装过程,其实oracle安装很简单,并不要把他相像的特别复杂. 本环境用:centos ...

  7. shell 脚本中的入参获取与判断

    1.获取shell脚本的入参个数: $# 2.获取shell脚本的第n个入参的字符个数/字符串长度(注意这里的n需要替换为具体的数字,如果这个数字超过实际的入参个数,结果为0): ${#n}

  8. linux版宝塔安装Redis

    1安装服务 2配置设置 3安装PHP扩展 首先,我们来安装服务,进入管理面板--软件管理--运行环境--redis-点击安装,等待完成 完成之后开始第二步,配置设置.这一步根据自己需要进行配置.注意安 ...

  9. Linux 的终端 Terminal

    打开终端: 方式一:在全部应用中搜索Terminal 方式二:Ctrl+Alt+T 快捷方式打开终端 终端指令查询 如果忘记终端指令而只记得前几位可以只输入前几个字母后按Tab键查询 终端清屏 键入c ...

  10. Powerful array CodeForces - 86D (莫队算法)

    An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, a ...