[笔记]MongoDB 二(Linux下MongoDB API C++编程)
一、连接类
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++编程)的更多相关文章
- MongoDB在Linux下常用优化设置
MongoDB在Linux下常用优化设置 以下是一些MongoDB推荐的常用优化设置.在生产环境下选取合适的参数值,例如预读值和默认文件描述符数目等,会对系统性能有很大的影响. 1.关闭数据库文件的 ...
- Linux下mongodb安装及数据导入导出教程
Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...
- Linux下MongoDB服务安装
Linux下MongoDB服务安装 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据 ...
- Linux下mongodb
Linux下mongodb安装: 新建mongodb文件夹 下载安装包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3. ...
- MongoDB在linux下的启动
最近公司数据库用到MongoDB,而之前只关注知道它是分布式非关系数据库,数据以文档的形式存储,数据格式是类似json的bson格式.而对于具体用法以及java如何调用并没有过多接触,今天花费一天的时 ...
- Java web与web gis学习笔记(二)——百度地图API调用
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
随机推荐
- python-day38(正式学习)
目录 线程 线程开启的两种方式 1 2 子线程和子进程的创建速度 子线程共享资源 线程的join方法 守护线程 线程其他用法 线程 线程开启的两种方式 1 from threading import ...
- 为什么说Python采用的是基于值的内存管理模式?
Python中的变量并不直接存储值,而是存储了值的内存地址或者引用,假如为不同变量赋值为相同值,这个值在内存中只有一份,多个变量指向同一块内存地址.
- Dockerfile安装jdk1.8 、部署java项目
基础指令 FROM 基于哪个镜像MAINTAINER 用来写备注信息,例如作者.日期等.COPY 复制文件进入镜像(只能用相对路径,不能用绝对路径)ADD 复制文件进入镜像(可以用绝对路径,假如是压缩 ...
- CentOs 7.6 开启防火墙后 无法显示远程文件夹
转:https://blog.csdn.net/ygwlove0110/article/details/88232065 遇到了个坑.服务器开启了防火墙后,ftp客户端连接就无法显示目录.关掉防火墙就 ...
- docker之常用命令
1) docker run -p : --name mysql -v d:/docker/mysql/conf:/etc/mysql/conf.d -v d:/docker/mysql/logs:/l ...
- symfony3 使用命令行工具生成Entity实体所踩的坑
1.把配置文件汇总连接邮箱的配置信息注释掉了,在创建Entity时php bin/console doctrine:generate:entity报错 2. 错误原因是实体文件映射到数据库中的字段时候 ...
- linux图形界面安装
1.问题现象 1.1 startx命令不可用 [root@linuxtest2 ~]# startx 1.3 init 5无法执行完成 [root@linuxtest2 ~]#init 5 2.问题原 ...
- Delphi FileListBox组件
- ERA-interim
数据介绍整理中... https://software.ecmwf.int/wiki/display/UER/Time-integrated+surface+solar+radiation+downw ...
- 终极之战:Linux & Windows
1.开源 当你买了一辆车,但你看不到引擎盖下面是什么?当你使用Windows驱动系统时就是如此.但是,相比之下,Linux完全是一个开源项目.你可以看看Linux操作系统的源代码,这是一个优点.Lin ...