MongoDB学习手册.docx

上传人:b****1 文档编号:17375463 上传时间:2023-04-24 格式:DOCX 页数:75 大小:524.66KB
下载 相关 举报
MongoDB学习手册.docx_第1页
第1页 / 共75页
MongoDB学习手册.docx_第2页
第2页 / 共75页
MongoDB学习手册.docx_第3页
第3页 / 共75页
MongoDB学习手册.docx_第4页
第4页 / 共75页
MongoDB学习手册.docx_第5页
第5页 / 共75页
点击查看更多>>
下载资源
资源描述

MongoDB学习手册.docx

《MongoDB学习手册.docx》由会员分享,可在线阅读,更多相关《MongoDB学习手册.docx(75页珍藏版)》请在冰豆网上搜索。

MongoDB学习手册.docx

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)删除所有

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1