mongodb学习使用记-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1235625
  • 博文数量: 76
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 2689
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 12:07
个人简介

樽中酒不空

文章分类

全部博文(76)

文章存档

2020年(4)

2019年(1)

2017年(2)

2016年(2)

2015年(7)

2014年(11)

2013年(13)

2012年(18)

2011年(2)

2010年(16)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: 数据库开发技术

2010-06-23 15:33:02

提要:
  mongodb的源码安装
  mongodb服务器端启动运行
  mongodb客户端程序运行
  使用官方的c 接口访问数据库


一 mongodb的源码安装
运行平台选择红帽企业版5(相同步骤在centos5.4下也安装成功。)
linux系统安装时选择比较简单,只安装了必要的开发工具,比如python2.4,gcc,g 等。
所以mongodb的一些依赖都要手动安装上。
1 pcre:
  下载,解压,然后./configure --enable-utf8 --enable-unicode-properties --enable-pcretest-libreadline,make,make install
  提示:  pcre需要readline和ncurses,不过这两个库很常见,下载安装即可。
  pcre make时如果提示函数链接错误,直接修改makefile,在libreadline = -lreadline 这一行加上 -lncurses

2 mozjs,下载1.7 ftp://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
  curl -o ftp://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
tar zxvf js-1.7.0.tar.gz
cd js/src
export cflags="-djs_c_strings_are_utf8"
make -f makefile.ref
js_dist=/usr make -f makefile.ref export

3 boost:
下载1.43
 安装前先:
rpm -e boost-devel-1.33.1-10.el5.i386

查找usr/include, usr/lib, 删掉所有旧版本boost

然后,
./bootstrap.sh
./bjam -shave_icu=1
(官方是./bjam -shave_icu=1 threading=multi --with-program_options --with-filesystem --with-date_time --with-thread)
编译完成后,
把新安装的boost路径放到path,ldconfig
或:cp -rf boost /usr/local/include/
    cp ./stage/*.* /usr/local/lib/
我用后面cp的方法。

4 安装 scons

下载 scons-2.0.0.final.0.tar.gz
执行python setup.py install
系统带的python是2.4,不需要更新到2.5或2.6。更新后需要修改ln,否则可能会出错。

5 编译mongodb

先编译:scons all
再安装:scons --prefix=/usr/local install
(我把从源码编译出的所有第三方库都放在/usr/local/下)。
编译过程中常见的错误有:找不到 jsapi.h, boost 多线程库函数链接问题,python的hashlib找不到等等。如果环境和我差不多的话,按上面操作是没问题的。实在不行,我个人是在虚拟机上装了多次linux系统,最后试出来的经验。
最后,切记,python升级后,一定要把原来的2.4和升级后的2.5或2.6链接做好,否则,这里出问题最多。

1 mongodb服务器端运行:
启动:nohup mongod&
如果提示没有/data/db目录,先创建,再执行。

2 mongodb客户端运行:
mongo
然后在命令行输入指令执行。


最重要的是通过c 接口来操作数据库,在first.cpp这个例子上修改:

先生成一个makefile:
c_flags= -wall -wpointer-arith -o3 -pipe -g -d_reentrant -d_gun_source -d_net_log
cxx= g
lib_dir=.
inc= -i/usr/local/include -i/usr/local/include/boost -i/usr/local/include/mongo -i.

lib= -l/usr/local/lib -lmongoclient -lboost_filesystem -lboost_system -lboost_thread -lboost_regex

sources_files_cpp=$(wildcard *.cpp)
exe_file=$(sources_files_cpp:%.cpp=%)

$(exe_file):
    for e in $(exe_file) ; \
          do \
            echo "$(cxx) -g -o2 -o $$e $$e.cpp $(c_flags) $(inc) $(lib)"; \
            $(cxx) -g -o2 -o $$e $$e.cpp $(c_flags) $(inc) $(lib);\
          done
#    for e in $(exe_file) ; \
        do \
          echo "strip ./$$e ";\
          strip ./$$e ;\
        done
all:$(exe_file)
    @echo "$(exe_file)"
clean:
    rm -f $(exe_file)

程序源码:
//first.cpp
#include "dbclient.h"
using namespace std;
using namespace mongo;
dbclientconnection conn;
int main()
{
   const char *port = "27017";
   string errmsg;
     
   if ( ! conn.connect( string( "127.0.0.1:" ) port , errmsg ) )
     {
       cout << "couldn't connect : " << errmsg << endl;
       return -1;
   }
   cout << "connect success " << endl;
   return 0;
}

编译,运行,可以看到运行结果。(mongod在之前先运行起来。)
这是connect功能。

下面是insert功能:

void insertmsg(uint32_t srcid, uint32_t destid, string& msg, uint32_t time)
{
      bsonobjbuilder obj;
    obj.append( "srcid" , srcid );
    obj.append( "destid" ,destid);
      obj.append( "msg" ,   msg.c_str());
    obj.append( "posttime" , time);

    conn.insert( "test.testmsg" , obj.obj() );
}
在main()中调用 insertmsg(1001, 1002, "test msg", 1100110010);
运行后,执行phpmoadmin,应该可以看到test库下面的testmsg表中有一条记录。

更简单一点的insert方法:
for( uint32_t i = 0; i < 1000001; i )
  conn.insert( "test.test1", bson( "_id" << i << "b" << i ) );
执行结束,会看到表中插入了1百万零一条记录。用time()得到两个时间相减,在我的机器上运行时间为27秒。
在前台能看到1百万条记录时刷新了几次页面才看到的。

删除非常简单,
conn.remove( "test.test1", bsonobj() ); //删掉表内所有记录。
conn.remove( ns, bson( "_id" << 99 );   //删掉_id为99的这条记录。

//条件删
char qbuf[256];
sprintf(qbuf, "this._id >= 50 && this._id <= 90");
query q = query("{}").where(qbuf);
conn.remove( ns, q); //删掉 50-90间的一组记录。可以根据sql where设置条件。
上面,ns是字符串变量,表示数据库名。
query("{}")看起来比较怪,是封装的json格式。如果不了解可以参考一下相关文档。如果不想看,记住这种写法就是了。

删掉一个表:
conn.dropcollection("test.test2");

更新符合条件记录:
mongodb_.update("test.webuser", query("web_uid" << 1001), bson("status"<<1));

更新所有记录:
mongodb_.update("test.webuser",  query("{}"), bson("status" << 1));

计数:
cout<
查一条记录:
bsonobj res = mongodb_.findone("test.test", query("_id"<<1001));
if (res.isempty())
{
//没找到
}
else
{
  uint32_t = res.getintfield("_id");
  string str = res.getstringfield("name");//假设有name这个字段,保存字符串数据
}

查多条记录,最多返回100条,保存到vector中:
auto_ptr cursor = mongodb_.query( "test.message", bson("srcid"<<1001), 100);
    while (cursor->more())
    {
        bsonobj obj = cursor->next();
        web_msg tmp;
        uint32_t cid = obj.getintfield("clientid");
        tmp.dwsenduid = cid;
        tmp.msg = obj.getstringfield("message");
        tmp.time = obj.getstringfield("posttime");
       
        list.push_back(tmp);
    }

取最大值:
uint32_t maxid = 0;
    query query;
    auto_ptr cursor = mongodb_.query("test.webuser" , query.sort(bson("web_uid" << -1)), 1);
    if (cursor->more())
    {
        bsonobj obj = cursor->next();
        maxid = obj.getintfield("web_uid");
    }

//取最小值
auto_ptr cursor = mongodb_.query("test.webuser" , query.sort(bson("web_uid" << -1)), 1);

注:sort中,-1表示降序排列,1表示升,所以,用-1排序取第一条记录,就是最大值。反之,就是最小值。

上面例子同时也说明排序的用法。

待续



阅读(7594) | 评论(2) | 转发(0) |
0

上一篇:没有了

下一篇:

给主人留下些什么吧!~~

sxcong2010-08-25 11:16:54

boost我是按缺省来编译的,自动就出了mt 我以前也碰到过总提示找不到mt,可能是一些老版本的影响了。完全删掉老版本的,再编译安装新的。可以find一下,然后rm掉。包括include和lib下所有的。

|

chinaunix网友2010-08-11 15:00:19

您好。我想问下怎么编译出libboost_thread-mt 我编译出来的只有libboost_thread。。。。

|
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图