MongoDB学习手册.docx
《MongoDB学习手册.docx》由会员分享,可在线阅读,更多相关《MongoDB学习手册.docx(75页珍藏版)》请在冰豆网上搜索。
MongoDB学习手册
MongoDB学习手册
作者:
李三来
QQ:
sanlai_lee@
邮箱:
li.sanlai@
说明
文档大部分内容来自MongoDB官网网站,仅供学习使用!
一、Mongodb简介
1.MongoDB的名称取自“humongous”(巨大的)的中间部分,足见mongodb的宗旨在处理大量数据上面
2.MongoDB是一个开源的、面向文档存储的数据库,属于Nosql数据库的一种
3.MongoDB可运行在unix、Windows和OSX平台上,支持32位和64位应用,并且提供了java、php、c、c++、c#、javaScript多种语言的驱动程序
4.目前正在使用MongoDB的网站和企业已经超过100多家
二、MongoDB特性
MongoDB是一个可扩展、高性能的下一代数据库,由C++语言编写,旨在为web应用提供可扩展的高性能数据存储解决方案。
它的特点是高性能、易部署、易使用,存储数据非常方便,主要特性有:
✧模式自由,支持动态查询、完全索引,可轻易查询文档中内嵌的对象及数组
✧面向文档存储,易存储对象类型的数据,包括文档内嵌对象及数组
✧高效的数据存储,支持二进制数据及大型对象(如照片和视频)
✧支持复制和故障恢复;提供了主-从、主-主模式的数据复制及服务器之间的数据复制
✧自动分片以支持云级别的伸缩性,支持水平的数据库集群,可动态添加额外的服务器
适用场景:
◆适合作为信息基础设施的持久化缓存层
◆适合实时的插入,更新与查询,并具备应用程序实时数据存储所需的复制及高度伸缩性
◆Mongo的BSON数据格式非常适合文档化格式的存储及查询
◆适合由数十或数百台服务器组成的数据库。
因为Mongo已经包含了对MapReduce引擎的内置支持
不适用场景:
◆要求高度事务性的系统
◆传统的商业智能应用
◆复杂的跨文档(表)级联查询
三、MongoDB的工作方式
◆MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富并且最像关系型数据库。
◆传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB同样也是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。
MongoDB里的集合对应于关系型数据库里的表,但是集合中没有列、行和关系的概念,这体现了模式自由的特点。
◆在MongoDB中数据以单文档为单位存储,这样就能在单个数据对象中表示复杂的关系。
文档可以由独立的基本类型属性、内嵌文档或文档数组组成。
◆MongoDB存储的数据格式是key-value对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。
这种数据格式称作BSON,即“BinarySerializedDocumentNotation”,是一种类似JSON的二进制序列化文档。
◆MongoDB是一个免安装的数据库,将它解压后生成一个bin目录,其中包含11个工具命令,除此之外不再需要任何其它的二进制依赖文件。
◆通常情况下启动数据库只需要关注其中的两个命令:
mongod和mongo。
前者是MongoDB数据库进程本身,是核心数据库服务器,后者是命令行Shell客户端,其使用方法通常类似于MySQL命令行Shell客户端,用于确保所有内容都已正常安装且能正常运行,并且可以对数据进行CRUD操作、执行管理任务等等。
◆MongoDB使用了内存映射文件进行数据管理,把所有空闲内存当缓存使用,且不能指定内存大小。
这既是优点也是缺点:
优点--可以最大限度提升性能;缺点--容易受其它程序干扰。
◆数据空间采用预分配,目的是为了避免形成过多的硬盘碎片。
它为每个数据库分配一系列文件,每个数据文件都会被预分配一个大小,第一个文件名字为“.0”,大小为64MB,第二个文件“.1”为128MB,依此类推,在32位模式运行时支持的最大文件为2GB。
随着数据量的增加,可以在其数据目录里看到这些不断递增的文件。
◆MongoDB没有自动递增或序列特性,当BSON对象插入到数据库中时,如果没有提供“_id”字段,数据库会自动生成一个ObjectId对象作为“_id”的值插入到集合中作为该文档的主键(这就避免了其它数据库意外地选择相同的惟一标识符的情况),“_id”的值由4字节的时间戳,3字节的机器号,2字节的进程id以及3字节的自增计数组成。
当然字段“_id”的值可以手动生成(任意类型都可),只要能够保证惟一性。
◆每个插入的BSON对象大小不能超过4MB,如果超过4M时需使用GridFS来储存数据。
◆为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用,所以删除记录不释放空间。
四、MongoDB的下载
1.MongoDB的官网:
http:
//www.mongodb.org/
2.MongoDB的下载地址:
http:
//www.mongodb.org/downloads
如上图,红色标记的是我们用来学习的版本
3.在联网的情况下,也可以通过如下命令来获取安装介质:
$curlhttp:
//downloads.mongodb.org/linux/mongodb-linux-x86_64-1.8.2-rc2.tgz>mongo.tgz
五、MongoDB的安装
1.解压安装介质:
$tarxzfmongo.tgz
2.进入mongo/bin目录,可以看到如下的文件列表:
-rwxr-xr-x1tsaiptsaip771948005-2105:
05bsondump
-rwxr-xr-x1tsaiptsaip336403205-2105:
05mongo
-rwxr-xr-x1tsaiptsaip774940805-2105:
05mongod
-rwxr-xr-x1tsaiptsaip775637605-2105:
05mongodump
-rwxr-xr-x1tsaiptsaip772767205-2105:
05mongoexport
-rwxr-xr-x1tsaiptsaip773176805-2105:
05mongofiles
-rwxr-xr-x1tsaiptsaip773586405-2105:
05mongoimport
-rwxr-xr-x1tsaiptsaip773599205-2105:
05mongorestore
-rwxr-xr-x1tsaiptsaip503500005-2105:
06mongos
-rwxr-xr-x1tsaiptsaip117649605-2105:
06mongosniff
-rwxr-xr-x1tsaiptsaip779765605-2105:
06mongostat
3.启动mongodb服务进程:
MongoDB默认的数据库文件的位置是/data/db,但是它不会自动的生产目录,所以如果采用默认的文件位置的话,我们需要自己先建立该目录,如下:
$sudomkdir-p/data/db/
$sudochown`id-u`/data/db
接下来可以启动mongodb的服务了:
$./mongod
我们也可以用-dbpath选项来指定自己的数据库位置,如下:
$./mongod-dbpath../../data/db
启动成功以后,会有如下界面显示:
[tsaip@ossesbwasbin]$MonMay3012:
17:
16[initandlisten]MongoDBstarting:
pid=3662port=27017dbpath=../../data/db64-bit
MonMay3012:
17:
16[initandlisten]dbversionv1.8.2-rc2,pdfileversion4.5
MonMay3012:
17:
16[initandlisten]gitversion:
373038f53049071fddb5404698c8bebf99e3b51f
MonMay3012:
17:
16[initandlisten]buildsysinfo:
Linuxbs-linux64.10gen.cc2.6.21.7-2.ec2.v1.2.fc8xen#1SMPFriNov2017:
48:
28EST2009x86_64BOOST_LIB_VERSION=1_41
MonMay3012:
17:
16[initandlisten]waitingforconnectionsonport27017
MonMay3012:
17:
16[websvr]webadmininterfacelisteningonport28017
4.启动命令常用参数选项说明
mongod启动数据库进程
--dbpath指定数据库的目录
--port指定数据库的端口,默认是27017
--bind_ip绑定IP
--directoryperdb为每个db创建一个独立子目录
--logpath指定日志存放目录
--logappend指定日志生成方式(追加/覆盖)
--pidfilepath指定进程文件路径,如果不指定,那么将不产生进程文件
--keyFile集群模式的关键标识
--cpu周期性的显示CPU和IO的利用率
--journal启用日志
--ipv6启用IPV6支持
--nssize指定.ns文件的大小,单位MB,默认是16M,最大是2GB
--maxConns最大的并发连接数
--notablescan不允许进行表扫描
--quota限制每个数据库的文件个数,默认是8个
--quotaFiles每个数据库的文件个数,配合—quota参数
--noprealloc关闭数据文件的预分配功能
…………更多的参数选项利用mongod–help进行查看
5.启动客户端
服务端进程启动成功以后,就可以启动客户端,跟服务端进行连接,如下:
[tsaip@ossesbwasbin]$./mongo
MongoDBshellversion:
1.8.2-rc2
connectingto:
test
MonMay3012:
36:
18[initandlisten]connectionacceptedfrom127.0.0.1:
59154#1
>
6.关闭mongodb服务
>useadmin;
switchedtodbadmin
>db.shutdownServer();
MonMay3012:
41:
52[conn2]terminating,shutdowncommandreceived
MonMay3012:
41:
52dbexit:
shutdowncalled
MonMay3012:
41:
52[conn2]shutdown:
goingtocloselisteningsockets...
MonMay3012:
41:
52[conn2]closinglisteningsocket:
5
MonMay3012:
41:
52[conn2]closinglisteningsocket:
6
MonMay3012:
41:
52[conn2]closinglisteningsocket:
7
MonMay3012:
41:
52[conn2]closinglisteningsocket:
8
MonMay3012:
41:
52[conn2]removingsocketfile:
/tmp/mongodb-27017.sock
MonMay3012:
41:
52[conn2]removingsocketfile:
/tmp/mongodb-28017.sock
MonMay3012:
41:
52[conn2]shutdown:
goingtoflushdiaglog...
MonMay3012:
41:
52[conn2]shutdown:
goingtoclosesockets...
MonMay3012:
41:
52[conn2]shutdown:
waitingforfspreallocator...
MonMay3012:
41:
52[conn2]shutdown:
closingallfiles...
MonMay3012:
41:
52closeAllFiles()finished
MonMay3012:
41:
52[conn2]shutdown:
removingfslock...
MonMay3012:
41:
52dbexit:
reallyexitingnow
MonMay3012:
41:
52DBClientCursor:
:
initcall()failed
MonMay3012:
41:
52queryfailed:
admin.$cmd{shutdown:
1.0}to:
127.0.0.1
servershouldbedown...
MonMay3012:
41:
52tryingreconnectto127.0.0.1
MonMay3012:
41:
52reconnect127.0.0.1failedcouldn'tconnecttoserver127.0.0.1
MonMay3012:
41:
52Error:
errordoingquery:
unknownshell/collection.js:
150
六、MongoDB数据类型
MongoDB除了包含这些string,integer,boolean,double,null,array,andobject基本的数据类型外,还包含:
date,objectid,binarydata,regularexpression,andcode这些附加的数据类型。
1.Timestamp类型
Timestamp类型从1.8版本开始支持,Timestamp有一个特殊的用法:
timestamp类型的字段必须是位于文档的前两位.看下面例子:
//位于第三个字段
>db.coll.insert({_id:
1,x:
2,y:
newTimestamp()});
>db.coll.findOne({_id:
1});
{"_id":
1,"x":
2,"y":
{"t":
0,"i":
0}}
//位于第二个字段
>db.coll.insert({_id:
2,y:
newTimestamp(),x:
2});
>db.coll.findOne({_id:
2});
{"_id":
2,"y":
{"t":
1306746538000,"i":
1},"x":
2}
2.ObjectId类型
在mongodb中,几乎每个文档(除了某些系统的Collection或者某些CappedCollection)都要求有一个主键:
_id,用来唯一标识他们,通常—它的值就是ObjectId类型。
当用户往文档中插入一条新记录的时候,如果没有指定_id属性,那么MongoDB会自动生成一个ObjectId类型的值,保存为_id的值。
_id的值可以为任何类型,除了数组,在实际应用中,鼓励用户自己定义_id值,但是要保证它的唯一性。
如下有两个方案:
✧SequenceNumbers:
序列号
传统的数据库中,通常用一个递增的序列来提供主键,在MongoDB中用ObjectId的来代替,我们可以通过如下的函数来获取主键:
functioncounter(name){
varret=db.counters.findAndModify({query:
{_id:
name},update:
{$inc:
{next:
1}},"new":
true,upsert:
true});
returnret.next;
}
db.users.insert({_id:
counter("users"),name:
"SarahC."})//_id:
1
db.users.insert({_id:
counter("users"),name:
"BobD."})//_id:
2
✧利用UUID
如果用UUID来提供主键,我们的应用需要自己去生成UUID,考虑到效率,建议把UUID保存为BSONBinData类型,如果用例中对效率要求不是很高,也可以保存为字符串类型。
3.数据库关联
在MongoDB中,通常的关联习惯有两种,一种是简单的手动关联,一种是用DBRef。
✧简单的手工关联
//查找
>db.post.save({title:
'MongoDBManual',author:
'sam'});
>p=db.post.findOne();
{
"_id":
ObjectId("4de36b33282677bdc555a83a"),
"title":
"MongoDBManual",
"author":
"sam"
}
//关联
>db.authors.findOne({name:
p.author});
{
"_id":
ObjectId("4de36c14282677bdc555a83b"),
"name":
"sam",
"age":
24,
"email":
"sanlai_lee@"
}
✧利用DBRef关联
DBRef关联语法:
{$ref:
,$id:
[,$db:
]}
例子:
>x={name:
'Biology'}
{"name":
"Biology"}
>db.courses.save(x)
>x
{"name":
"Biology","_id":
ObjectId("4b0552b0f0da7d1eb6f126a1")}
>stu={name:
'Joe',classes:
[newDBRef('courses',x._id)]}
//orwecouldwrite:
//stu={name:
'Joe',classes:
[{$ref:
'courses',$id:
x._id}]}
>db.students.save(stu)
>stu
{
"name":
"Joe",
"classes":
[
{
"$ref":
"courses",
"$id":
ObjectId("4b0552b0f0da7d1eb6f126a1")
}
],
"_id":
ObjectId("4b0552e4f0da7d1eb6f126a2")
}
>stu.classes[0]
{"$ref":
"courses","$id":
ObjectId("4b0552b0f0da7d1eb6f126a1")}
>stu.classes[0].fetch()
{"_id":
ObjectId("4b0552b0f0da7d1eb6f126a1"),"name":
"Biology"
七、GridFS文件系统
由于在MongoDB中,1.7版本之前,BSON对象的大小只有4MB的限制,1.7-1.8版本,大小限制是16MB,将来的版本,这个数值还会提高,不适合存储一些大型文件。
但是MongoDB提供了GridFS文件系统,为大型文件的存储提供了解决方案。
八、索引
MongoDB的索引跟传统数据库的索引相似,一般的如果在传统数据库中需要建立索引的字段,在MongoDB中也可以建立索引。
MongoDB中_id字段默认已经建立了索引,这个索引特殊,并且不可删除,不过CappedCollections例外。
1.建立索引
建立索引的函数:
ensureIndex()
例子:
>$db.persons.ensureIndex({name:
1});
2.使用索引
a)普通索引
>$db.persons.find({name:
’sam’});//fast-usesindex
>$db.persons.find({age:
3});//slow-hastocheckallbecause'age'isn'tindexed
b)嵌入式索引
>$db.things.ensureIndex({"address.city":
1})
c)文档式索引
>$db.factories.insert({name:
"xyz",metro:
{city:
"NewYork",state:
"NY"}});
>$db.factories.ensureIndex({metro:
1});
d)组合索引
>$db.things.ensureIndex({j:
1,name:
-1});
e)唯一索引
>$db.things.ensureIndex({firstname:
1,lastname:
1},{unique:
true});
当一个记录被插入到唯一性索引文档时,缺失的字段会以null为默认值被插入文档
例子:
>$db.things.ensureIndex({firstname:
1},{unique:
true});
>$db.things.save({lastname:
"Smith"});
//下面这个操作将会失败,因为firstname上有唯一性索引,值为null
>$db.things.save({lastname:
"Jones"});
3.查看索引
>db.persons.getIndexes();
[
{
"name":
"_id_",
"ns":
"test.persons",
"key":
{
"_id":
1
},
"v":
0
},
{
"_id":
ObjectId("4de39060282677bdc555a83d"),
"ns":
"test.persons",
"key":
{
"name":
1
},
"name":
"name_1",
"v":
0
}
]
4.删除索引
a)删除所有