一、连接类

  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. P1004方格取数

    这是提高组得一道动态规划题,也是学习y氏思考法的第一道题. 题意为给定一个矩阵,里面存有一些数,你从左上角开始走到右下角,另一个人从右下角开始走到左上角,使得两个人取数之和最大,当然一个数只可以取走一 ...

  2. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

  3. 一款完美代替微信小程序原生客服消息的工具:

    一.设置:无需开发,多种回复(自动+人工)   自动回复形式有3种: 打开客服消息(用户只要和客服互动过一次,再次点击进入,会收到设置好的自动回复) 关键词回复(用户在小程序中回复某个关键词内容时,会 ...

  4. ArcGis之popup列表字段自定义

    ArcGis之popup列表字段自定义 featureLayer图层中可以使用popupTemplate属性添加弹窗. API:https://developers.arcgis.com/javasc ...

  5. Linux之常用脚本

    1) #检查php Money 队列脚本是否启动 php_count=`ps -ef | grep Money | grep -v "grep" | wc -l` ];then e ...

  6. 多Y轴,下拉框渲染,相同类型不同数据

    放上json文件: { "2017年3月": { "outKou": "5525.86", "inKou": " ...

  7. 转载: Ubuntu 在命令下,安装中文环境的方法。

    转载: https://blog.csdn.net/zhangchao19890805/article/details/52743380 安装英文版ubuntu,在打开含有中文字符文件时会乱码,有需要 ...

  8. 查询服务商的当月提审限额和加急次数(Quota) 调用遇到问题的来说说是什么情况{"errcode":-1,"errmsg":"system error hint: [_KbPJA05231543]"}

    感觉完全是按照微信官方的要求来的,还是提示错误.大家有遇到吗?在微信开发者社区里搜索相关问题,也是有人遇到这样的错误. 还是根据社区里说的,换过用开放平台的component accesstoken  ...

  9. python 出现OSError: [Errno 8] Exec format error的原因

    访问 .py文件的网页的时候会出现 Exec format error的问题, 一般情况下是由于基于Unix(Linux,Mac OS)系统下的问题,办法如下 1 .chmod +x  filenam ...

  10. shell脚本中的日期处理

    Ps:这篇文章只是为了做个分类,以后有看到比较好的时间处理命令都会列在这里,您如果有什么好的时间处理命令,可以评论中添加,我会定期查看更新,谢谢! 1.定义一个参数DATE_TODAY,用于记录当天时 ...