热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDBC++客户端开发

0.前言:网上关于MongoDB的资料不少,大都是基于shell讲述的,对应到C++客户端的开发还是有点小迷惑,自己小结一下,同时也带着疑问,想大家讨教。1.安装,不讲了,安装都不会就不要搞MongoDB了。只提一下,自己遇到的问题。第一个是scons,只要sudo

0. 前言:网上关于MongoDB的资料不少,大都是基于shell讲述的,对应到C++客户端的开发还是有点小迷惑,自己小结一下,同时也带着疑问,想大家讨教。

1. 安装,不讲了,安装都不会就不要搞MongoDB了。

 只提一下,自己遇到的问题。第一个是scons,只要sudo apt-get install scons就好了,MAC下可以用sudo port install scons. 至于port是什么,baidu一下就知道了。

 第二个是scons install 的安装有很多问题,首先是官网下载的压缩包全部文件都是只读属性(疑问:不知道scons是怎么能读的~~~),需要用 "chmod -R a+r ./"把属性都改一下,再安装,或者安装好之后到/user/local/include/mongo下执行(加sudo,你们懂的)。这样还不一定就行,scons install 的安装脚本忘记了copy 一些头文件,比如platform之类的,自己动手丰衣足食吧:~。我最后的解决办法是不安装了,直接用src的下面的mongo目录加到项目的include查找路径中。

第三个是mongo/util/time_support.h这个文件不知道出什么问题了,编译的时候总提示verify没定义,加了一个#include "pch.h"在文件开始的第二行,OK了。

2. 编译脚本。发现MongoDB竟然不是用Makefile,用的是scons,偶也时髦一把,照样子写了一个来编译自己的程序:),不看也罢

import os
import sys
env = Environment()
env.Append(CPPPATH =    [
'../../3rds',
'../../3rds/mongo',
            ])
env.Append(CCFLAGS =     [
            '-g',
'-Wall',
'-Wno-deprecated-declarations',
'-Wno-strict-aliasing'
            '-O2',
'-std=c++0x'
            ])

libs =     [
        'event',
        'pthread',
        'boost_filesystem',
        'boost_system',
        'boost_program_options'
        ]
if "darwin" == sys.platform:
    libs.append('boost_thread')
elif sys.platform in ("linux2", "linux3"):
#why my CentOS boost_thread lib has a prefix name ?? I don't know
    libs.append('boost_thread-mt')

env.Append(LIBS = libs)
source =    [   
'main.cpp',
'dbmodule.cpp',
'../../3rds/mongo/libmongoclient.a'
            ]
t = env.Program(target='xxx', source=source)
Default(t);
3. 语法映射。大家在网上看到的多是shell的语法,虽然官网上有一个简单的SQL-Shell-C++的对照表。但是,有些粗陋,也不完整。偶补充一些:

A. 最简单的

select a,b from user ==>(官网的说法)

auto_ptr cursor =
  c.query("mydb.users", Query(), 0, 0, BSON("a"<<1<<"b"<<1));
错了

应为:

BSONObj field = BSON("a"<<1<<"b"<<1);

auto_ptr cursor =
  c.query("mydb.users", Query(), 0, 0, &field);

因为该方法的第五个参数是一个BSONObj的指针,BSON宏实际返回的是BSONObjBuilder对象的obj()方法,返回类型不是const 对象,无法直接取地址。

B. 查询指定返回什么字段,不返回字段

bo field = BSON("pass" <<1 <<"_id" << 0);

还是第五个参数,传上面的 &field就返回pass字段,不返回_id字段。嗯,是的,1就返回,0不返回。

C.  update

        std::string json = "{$set:";
        json += info; // 你要update的东西,任何标准JSON格式均可
        json += "}";
        c.update(DBM_USER_DBSET, QUERY("user"<

D. 返回sort(排序)之后的limit。应用场景就是一个排行榜的 TOP 10

shell: db.score.find(cond).sort({score:-1}).limit(10) ==>

c.query("database.score", Query(cond).sort("score", -1), 10, 0, &field);

我不能理解为什么shell这样写:

db.user.find().limit(10).sort({score:-1})

也能返回正确的排序之后的 top N 结果。有知道的朋友帮忙解析一下,谢谢!

E. 日期类型:

new Date ==》

BSON("created"<

很好奇,不同的客户端查询回来的Date类型字段是不一样的结果。shell返回的是一个字符串,C++返回的竟然是"{created: new Date(39473947379)}", 叫我应用如何处理?

后来改成这样了:

"created"<

好吧,就是不用Date类型了~,虽然我怀疑取得的是客户端机器的时间。但是 DATENOW 也不见得就是取的是服务器的时间:~,有清楚这个的朋友,不吝赐教一下,谢谢!

All rights reserved!


推荐阅读
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Linux下安装依赖包版本高解决方法
    本文介绍了在Linux系统下,当已安装的依赖包版本高于需要安装的依赖包版本时,解决方法包括欺骗安装程序和修改相关配置文件等操作。针对不同情况,提供了不同的解决方案。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
author-avatar
陌北从南_221
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有