简介
MongoDB 是一个由C++语言编写的、基于分布式文件存储的开源数据库系统,其旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
环境
Win7 64位,VS2013。
下载
MongoDB提供了可用于32位和64位系统的预编译二进制包。预编译二进制包下载地址
注:
在 MongoDB2.2 版本后已经不再支持 Windows XP 系统。
• Windows Server 2008 R2 64-bit and later,with SSL suport x64
适合64 位的Windows Server 2008 R2,Windows 7及最新版本的Window系统。支持SSL。
• Windows Server 2008 R2 64-bit and later,without SSL suport x64
• WindowsVista 32-bit,without SSL suport i386
适合32位的Window系统及最新的Windows Vista。不支持SSL。
• Windows Server 2008 64-bit,without SSL suport x64
适合64位的Windows Vista,Windows Server 2003及Windows Server 2008 。不支持SSL。
注册Windows服务
1)启动cmd.exe后,切换至“MongoDB根目录\bin”目录;
2)执行命令:
mongod.exe --bind_ip 127.0.0.1 --logpath "C:\Program Files\MongoDB\log\mongodb.log" --logappend --dbpath "C:\Program Files\MongoDB\db" --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" –install
注:
logpath目录需事先创建。
注:
若需删除Windows服务,则以管理员身份运行cmd.exe后,执行命令“
sc delete 服务名称”即可。
可视化管理工具Robomongo
Robomongo 是一个基于 Shell 的跨平台开源 MongoDB 管理工具。
下载Robomongo
MongoDB命令
6.1. 创建数据库
语法:use DATABASE_NAME
简介:如果数据库不存在,则创建数据库,否则切换到指定数据库。
实例:
> use runoob
switched to db runoob
> db
runoob
6.2. 创建集合
语法:db.createCollection(“cappedLogCollection”)
简介:
1)db.createCollection(name):创建一个名字为name的集合,该集合没有任何大小、数量等限制,使用_id作为默认索引;
2)db.createCollection(name, {size:1024})或db.createCollection(name, {capped:true, size:1024}):创建一个名字为name、空间大小限制在1M以内的集合,若大小超过1M,则会删除最早的记录;
3)db.createCollection(name, {max:1024}):创建一个名字为name、最大条目为1024的集合,若文档条目超过1024后,继续插入文档则会删除最早的一条记录。(这个不能使用capped:true,否则会报错)
4)db.createCollection(name, {size:1024, max:1024})或db.createCollection(name, {capped:true, size:1024, max:1024}):创建一个名字为name、空间大小限制在1M以内、最大条目为1024的集合。
6.3. 创建索引
索引通常能够极大的提高查询的效率,若没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟。
所有的MongoDB集合默认都有一个唯一索引在字段“_id”上,如果应用程序没有为“_id”列定义一个值,MongoDB将创建一个带有ObjectId值的列(ObjectId是基于 时间、计算机ID、进程ID、本地进程计数器 生成的)。
语法:db.COLLECTION_NAME.ensureIndex({KEY:1})
简介:COLLECTION_NAME表示集合名称, Key 表COLLECTION_NAME中字段,1表示升序(-1:表示降序)。ensureIndex() 接收可选参数,可选参数列表如下:
实例:
通过ensureIndex命令为集合RecordIDCollection创建一个以tableName升序排列、siteID降序排列的索引。
> db.RecordIDCollection.ensureIndex({"tableName":1, "siteID":-1})
Mongo CXX Driver编译
7.1. Boost编译
Boost下载地址
注:
(MongoDB C++驱动依赖Boost库(1.49及以上版本),本文测试采用boost_1_62_0版本)
Boost编译步骤:
1)解压Boost。
2)若编译32-bit,则打开cmd.exe;若编译64-bit,则打开“VS2013 开发人员命令提示”。
3)切换至Boost根目录。
4)执行命令:bootstrap.bat。
Boost根目录生成 b2.exe 、bjam.exe 、project-config.jam 、bootstrap.log四个文件。
5)编译Boost,执行命令:
编译32-bit:
b2 stage --toolset=msvc-12.0 --without-python --stagedir="F:\boost\32" link=static runtime-link=shared runtime-link=static threading=multi debug release
编译64-bit:
b2 stage --toolset=msvc-12.0 --without-python --stagedir="F:\boost\64" link=static runtime-link=shared runtime-link=static threading=multi debug release
bjam命令参数分析:
(1)stage/install:
stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK\boost\boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。(2)toolset:
指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。(3)without/with:
选择不编译/编译哪些库。因为python、mpi等库都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页下载安装。
查看boost包含库的命令是bjam –show-libraries。(4)stagedir/prefix:
stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。(5)link:
生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。(6)runtime-link:
动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。(7)threading:
单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。(8)debug/release:
编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。
7.2. Python安装
Python下载地址
因scons只有32位安装包可用,故选择python2.7 32-bit。
安装后,将 Python27安装目录、Python27安装目录\Scripts添加至系统环境变量。
注:
1、MongoDB编译需使用Python 2.X版本
2、Python必须先于SCons安装。
7.3. SCons安装
SCons下载地址
SCons是一个采用Python编写的自动化构建工具,从构建这个角度说,它跟GNU make是同一类的工具,其集成功能类似于autoconf/automake。
安装时,请注意选择Python版本。
7.4. Mongo CXX Driver下载
Mongo CXX Driver下载地址
注:
不同版本Mongo CXX
Driver的编译方法可能存在差异,本文最先采用mongo-cxx-driver-r3.0.3版本,编译失败,最终采用mongo-cxx-driver-releases-legacy版本。
7.5. Mongo CXX Driver编译
1)若编译32-bit,则打开cmd.exe;若编译64-bit,则打开“VS2013 开发人员命令提示”。
2)切换至Monggo CXX Driver根目录。
3)依次执行命令:
编译32-bit:
scons --32 --prefix=C:\install\32 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\32\lib" install --dynamic-boost=off
scons --32 --prefix=C:\install\32 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\32\lib" install --dbg=on --dynamic-boost=off
scons --32 --prefix=C:\install\32 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\32\lib" install --dynamic-windows --sharedclient --dynamic-boost=off
scons --32 --prefix=C:\install\32 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\32\lib" install --dynamic-windows --sharedclient --dbg=on --dynamic-boost=off
编译64-bit:
scons --prefix=C:\install\64 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\64\lib" install --dynamic-boost=off
scons --prefix=C:\install\64 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\64\lib" install --dbg=on --dynamic-boost=off
scons --prefix=C:\install\64 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\64\lib" install --dynamic-windows --sharedclient --dynamic-boost=off
scons --prefix=C:\install\64 --cpppath="C:\ boost_1_62_0" --libpath="F:\boost\64\lib" install --dynamic-windows --sharedclient --dbg=on --dynamic-boost=off
scons命令参数分析:
(1)prefix:
prefix表示要生成的include文件和lib/dll文件的位置。(2)cpppath:
cpppath表示Boost路径。(3)libpath:
libpath表示Boost编译生成的库文件路径。(4)dynamic-boost=[on|off|auto] :
指定链接boost库的方式,动态链接/静态链接/ 只有在指定–dynamic-windows时动态链接3种。(5)dbg=[on|off]:
dbg=[on|off]表示启用Debug模式,默认不启用。(6)dynamic-windows:
dynamic-windows表示/MD编译,默认使用/MT。若编译动态库,则须使用该选项。(7)sharedclient:
Sharedclient表示编译动态库。
注:
Window平台Mongo CXX Driver编译帮助文档
MongoDB在VS2013中应用
8.1. 设置VS工程属性
1)设置Mongo/Boost头文件路径:
2)添加预处理命令:
预处理命令分析:
1) BOOST_ERROR_CODE_HEADER_ONLY:
用途不明确。若不添加,则编译时会提示“ error LNK2001: 无法解析的外部符号 “class boost::system::error_category const & __cdecl boost::system:: generic_category(void)” (?generic_category@system@boost@@YAAEBVerror _category@12@XZ)”等错误。2)BOOST_PYTHON_STATIC_LIB:
3)_CRT_SECURE_NO_WARNINGS:
表示禁用不安全警告。4)STATIC_LIBMONGOCLIENT:
表示使用Boost静态链接库。
3)设置Mongo/Boost库文件路径:
4)设置Mongo lib文件:
注:
1)选择正确版本的mogoclient lib文件:
Debug模式应选择libmongoclient-gd.lib,Release模式应选择libmongoclient.lib。
8.2. VS2013测试
#include
#include
#include "mongo\client\dbclient.h"
void run()
{
mongo::DBClientConnection c;
c.connect("127.0.0.1:27017");
///1、Insert
mongo::BSONObjBuilder objBuilder;
objBuilder.append("username", "zhang_san");
objBuilder.append("age", 26);
objBuilder.append("salary", 120);
objBuilder.append("sex", "Male");
c.insert("test.mycollection", objBuilder.obj());
///2、Query
std::auto_ptr cursor = c.query("test.mycollection", BSON("age" << 26));
const char *strUserName = NULL;
int nSalary;
while (cursor->more())
{
mongo::BSONObj obj = cursor->next();
strUserName = obj.getStringField("username");
nSalary = obj.getIntField("salary");
}
///3、update
c.update("test.mycollection", BSON("username" << "zhang_san"), BSON("salary" << 121));
///4、delete
c.remove("test.mycollection", BSON("username" << "zhang_san"));
}
int main()
{
mongo::client::initialize();
try
{
run();
std::cout << "connected ok" << std::endl;
}
catch (const mongo::DBException &e)
{
std::cout << "caught " << e.what() << std::endl;
}
return EXIT_SUCCESS;
}
数据结构展示:
注:
1)若采用静态链接Boost库(/MT build (static C RTL))时,编译过程中提示“error LNK2005: _ already defined in msvcprt.lib(MSVCP100.dll) libboost_thread-vc100-mt-1_42.lib(thread.obj)”等错误,则说明 “scons –dynamic-windows”命令所涉及库的C runtime library不一致(dynamic-windows选项表示将使用dynamic link C RTL而不是 static C RTL)。
2)若运行过程中,程序崩溃并提示:
则,在程序中添加代码”mongo::client::initialize();”即可。
(该错误为monggodb在调用boost时导致的,但不添加代码并不一定会导致崩溃,如demo程序与实际开发所使用的库完全一致,同样的操作,demo正常运行而实际开发时却崩溃。)