mongo笔记.docx
- 文档编号:28875409
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:18
- 大小:79.13KB
mongo笔记.docx
《mongo笔记.docx》由会员分享,可在线阅读,更多相关《mongo笔记.docx(18页珍藏版)》请在冰豆网上搜索。
mongo笔记
NoSQL简介
NoSQL(NoSQL=NotOnlySQL),意即"不仅仅是SQL"。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。
1970年E.F.Codd's提出的关系模型的论文"Arelationalmodelofdataforlargeshareddatabanks",这使得数据建模和应用程序编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。
NoSQL是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。
NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
关系型数据库遵循ACID规则
事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:
1、A(Atomicity)原子性
原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
比如银行转账,从A账户转100元至B账户,分为两个步骤:
1)从A账户取100元;2)存入100元至B账户。
这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。
2、C(Consistency)一致性
一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。
3、I(Isolation)独立性
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。
4、D(Durability)持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
分布式系统
分布式系统(distributedsystem)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。
分布式系统是建立在网络之上的软件系统。
正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。
分布式系统可以应用在不同的平台上如:
Pc、工作站、局域网和广域网上等。
分布式计算的优点
可靠性(容错):
分布式计算系统中的一个重要的优点是可靠性。
一台服务器的系统崩溃并不影响到其余的服务器。
可扩展性:
在分布式计算系统可以根据需要增加更多的机器。
资源共享:
共享数据是必不可少的应用,如银行,预订系统。
灵活性:
由于该系统是非常灵活的,它很容易安装,实施和调试新的服务。
更快的速度:
分布式计算系统可以有多台计算机的计算能力,使得它比其他系统有更快的处理速度。
开放系统:
由于它是开放的系统,本地或者远程都可以访问到该服务。
更高的性能:
相较于集中式计算机网络集群可以提供更高的性能(及更好的性价比)。
分布式计算的缺点
故障排除:
故障排除和诊断问题。
软件:
更少的软件支持是分布式计算系统的主要缺点。
网络:
网络基础设施的问题,包括:
传输问题,高负载,信息丢失等。
安全性:
开发系统的特性让分布式计算系统存在着数据的安全性和共享的风险等问题。
什么是NoSQL?
NoSQL,指的是非关系型的数据库。
NoSQL有时也称作NotOnlySQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。
(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。
这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
为什么使用NoSQL?
今天我们可以通过第三方平台(如:
Google,Facebook等)可以很容易的访问和抓取数据。
用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。
我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了,NoSQL数据库的发展也却能很好的处理这些大的数据。
RDBMSvsNoSQL
RDBMS
-高度组织化结构化数据
-结构化查询语言(SQL)(SQL)
-数据和关系都存储在单独的表中。
-数据操纵语言,数据定义语言
-严格的一致性
-基础事务
NoSQL
-代表着不仅仅是SQL
-没有声明性查询语言
-没有预定义的模式
-键-值对存储,列存储,文档存储,图形数据库
-最终一致性,而非ACID属性
-非结构化和不可预知的数据
-CAP定理
-高性能,高可用性和可伸缩性
MongoDB创建数据库的语法格式如下:
useDATABASE_NAME
实例
以下实例我们创建了数据库runoob:
>userunoob
switchedtodbrunoob>db
runoob>
如果你想查看所有数据库,可以使用showdbs命令:
>showdbslocal0.078GB
test0.078GB>
可以看到,我们刚创建的数据库runoob并不在数据库的列表中,要显示它,我们需要向runoob数据库插入一些数据。
>db.runoob.insert({"name":
"菜鸟教程"})WriteResult({"nInserted":
1})>showdbslocal0.078GB
runoob0.078GB
test0.078GB>
MongoDB删除数据库的语法格式如下:
(删除数据库的时候,必须进入指定的库)
db.dropDatabase()
删除集合
集合删除语法格式如下:
db.collection.drop()
以下实例删除了runoob数据库中的集合site:
>userunoob
switchedtodbrunoob>showtables(显示数据的表)
site>db.site.drop()true>showtables>
MongoDB插入文档
文档的数据结构和JSON基本一样。
所有存储在集合中的数据都是BSON格式。
BSON是一种类json的一种二进制形式的存储格式,简称BinaryJSON。
插入文档
MongoDB使用insert()或save()方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
实例
以下文档可以存储在MongoDB的runoob数据库的col集合中:
>db.test.insert({title:
'MongoDB教程',description:
'MongoDB是一个Nosql数据库',by:
'菜鸟教程',url:
'',tags:
['mongodb','database','NoSQL'],likes:
100})
我们也可以将数据定义为一个变量,如下所示:
>document=({title:
'MongoDB教程',description:
'MongoDB是一个Nosql数据库',by:
'菜鸟教程',url:
'',tags:
['mongodb','database','NoSQL'],likes:
100});
db.col.insert(document)
插入文档你也可以使用db.col.save(document)命令。
如果不指定_id字段save()方法类似于insert()方法。
如果指定_id字段,则会更新该_id的数据。
3.2版本后还有以下几种语法可用于插入文档:
∙db.collection.insertOne():
向指定集合中插入一条文档数据
∙db.collection.insertMany():
向指定集合中插入多条文档数据
#插入单条数据
>vardocument=db.collection.insertOne({"a":
3})>document{
"acknowledged":
true,
"insertedId":
ObjectId("571a218011a82a1d94c02333")}
#插入多条数据>varres=db.collection.insertMany([{"b":
3},{'c':
4}])>res{
"acknowledged":
true,
"insertedIds":
[
ObjectId("571a22a911a82a1d94c02337"),
ObjectId("571a22a911a82a1d94c02338")
]}
MongoDB更新文档
MongoDB使用update()和save()方法来更新集合中的文档。
接下来让我们详细来看下两个函数的应用及其区别。
update()方法
update()方法用于更新已存在的文档。
语法格式如下:
db.collection.update(
{
upsert:
multi:
writeConcern:
})
参数说明:
∙query:
update的查询条件,类似sqlupdate查询内where后面的。
∙update:
update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sqlupdate查询内set后面的
∙upsert:
可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
∙multi:
可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
∙writeConcern:
可选,抛出异常的级别
我们在集合col中插入如下数据:
>db.test.insert({title:
'MongoDB教程',description:
'MongoDB是一个Nosql数据库',by:
'菜鸟教程',url:
'',tags:
['mongodb','database','NoSQL'],likes:
100})
接着我们通过update()方法来更新标题(title):
>db.col.update({'title':
'MongoDB教程'},{$set:
{'title':
'MongoDB'}})
WriteResult({"nMatched":
1,"nUpserted":
0,"nModified":
1})#输出信息
>db.col.find().pretty(){
"_id":
ObjectId("56064f89ade2f21f36b03136"),
"title":
"MongoDB",
"description":
"MongoDB是一个Nosql数据库",
"by":
"菜鸟教程",
"url":
"",
"tags":
[
"mongodb",
"database",
"NoSQL"
],
"likes":
100}>
可以看到标题(title)由原来的"MongoDB教程"更新为了"MongoDB"。
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置multi参数为true。
>db.col.update({'title':
'M'},{$set:
{'title':
'MongoDB'}},{multi:
true})
save()方法
save()方法通过传入的文档来替换已有文档。
语法格式如下:
db.collection.save(
{
writeConcern:
})
实例
以下实例中我们替换了_id为56064f89ade2f21f36b03136的文档数据:
>db.col.save({
"_id":
ObjectId("56064f89ade2f21f36b03136"),
"title":
"MongoDB",
"description":
"MongoDB是一个Nosql数据库",
"by":
"Runoob",
"url":
"",
"tags":
[
"mongodb",
"NoSQL"
],
"likes":
110})
只更新第一条记录:
db.col.update({"count":
{$gt:
1}},{$set:
{"test2":
"OK"}});
全部更新:
db.col.update({"count":
{$gt:
3}},{$set:
{"test2":
"OK"}},false,true);
只添加第一条:
db.col.update({"count":
{$gt:
4}},{$set:
{"test5":
"OK"}},true,false);
全部添加加进去:
db.col.update({"count":
{$gt:
5}},{$set:
{"test5":
"OK"}},true,true);
全部更新:
db.col.update({"count":
{$gt:
15}},{$inc:
{"count":
1}},false,true);
只更新第一条记录:
db.col.update({"count":
{$gt:
10}},{$inc:
{"count":
1}},false,false);
MongoDB删除文档
MongoDBremove()函数是用来移除集合中的数据。
MongoDB数据更新可以使用update()函数。
在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
语法
remove()方法的基本语法格式如下所示:
db.collection.remove(
如果你的MongoDB是2.6版本以后的,语法格式如下:
db.collection.remove(
{
justOne:
writeConcern:
})
参数说明:
∙query:
(可选)删除的文档的条件。
∙justOne:
(可选)如果设为true或1,则只删除一个文档。
∙writeConcern:
(可选)抛出异常的级别。
实例
以下文档我们执行两次插入操作:
>db.col.insert({title:
'MongoDB教程',
description:
'MongoDB是一个Nosql数据库',
by:
'菜鸟教程',
url:
'',
tags:
['mongodb','database','NoSQL'],
likes:
100})
使用find()函数查询数据:
>db.col.find(){"_id":
ObjectId("56066169ade2f21f36b03137"),"title":
"MongoDB教程","description":
"MongoDB是一个Nosql数据库","by":
"菜鸟教程","url":
"","tags":
["mongodb","database","NoSQL"],"likes":
100}{"_id":
ObjectId("5606616dade2f21f36b03138"),"title":
"MongoDB教程","description":
"MongoDB是一个Nosql数据库","by":
"菜鸟教程","url":
"","tags":
["mongodb","database","NoSQL"],"likes":
100}
接下来我们移除title为'MongoDB教程'的文档:
>db.col.remove({'title':
'MongoDB教程'})WriteResult({"nRemoved":
2})#删除了两条数据>db.col.find()……#没有数据
删除第一条找到的记录可以设置justOne为1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
删除所有数据,可以使用以下方式(类似常规SQL的truncate命令):
>db.col.remove({})>db.col.find()
remove()方法已经过时了,现在官方推荐使用deleteOne()和deleteMany()方法。
如删除集合下全部文档:
db.inventory.deleteMany({})
删除status等于A的全部文档:
db.inventory.deleteMany({status:
"A"})
删除status等于D的一个文档:
db.inventory.deleteOne({status:
"D"})
MongoDB查询文档
MongoDB查询文档使用find()方法。
find()方法以非结构化的方式来显示所有文档。
语法
MongoDB查询数据的语法格式如下:
db.collection.find(query,projection)
∙query:
可选,使用查询操作符指定查询条件
∙projection:
可选,使用投影操作符指定返回的键。
查询时返回文档中所有键值,只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下:
>db.col.find().pretty()
pretty()方法以格式化的方式来显示所有文档。
MongoDB条件操作符
MongoDB中条件操作符有:
∙(>)大于-$gt
∙(<)小于-$lt
∙(>=)大于等于-$gte
∙(<=)小于等于-$lte
使用find()命令查看数据:
MongoDB(>)大于操作符-$gt
如果你想获取"col"集合中"likes"大于100的数据,你可以使用以下命令:
db.col.find({"likes":
{$gt:
100}})
MongoDB(>=)大于等于操作符-$gte
如果你想获取"col"集合中"likes"大于等于100的数据,你可以使用以下命令:
db.col.find({likes:
{$gte:
100}})
类似于SQL语句:
Select*fromcolwherelikes>=100;
MongoDB(<)小于操作符-$lt
如果你想获取"col"集合中"likes"小于150的数据,你可以使用以下命令:
db.col.find({likes:
{$lt:
150}})
类似于SQL语句:
Select*fromcolwherelikes<150;
MongoDB(<=)小于操作符-$lte
如果你想获取"col"集合中"likes"小于等于150的数据,你可以使用以下命令:
db.col.find({likes:
{$lte:
150}})
类似于SQL语句:
Select*fromcolwherelikes<=150;
MongoDB使用(<)和(>)查询-$lt和$gt
如果你想获取"col"集合中"likes"大于100,小于200的数据,你可以使用以下命令:
db.col.find({likes:
{$lt:
200,$gt:
100}})
类似于SQL语句:
Select*fromcolwherelikes>100ANDlikes<200;
$gt--------greaterthan>
$gte---------gtequal>=
$lt--------lessthan<
$lte---------ltequal<=
$ne-----------notequal!
=
$eq--------equal=
MongoDBLimit与Skip方法
MongoDBLimit()方法
limit()方法基本语法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
>db.col.find({},{"title":
1,_id:
0}).limit
(2){"title":
"PHP教程"}{"title":
"Java教程"}>
如果你们没有指定limit()方法中的参数则显示集合中的所有数据。
MongoDBSkip()方法
我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数
skip()方法脚本语法格式如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
实例
以上实例只会显示第二条文档数据
>db.col.find({},{"title":
1,_id:
0}).limit
(1).skip
(1){"title":
"Java教程"}
想要读取从10条记录后100条记录,相当于sql中limit(10,100)。
>db.COLLECTION_NAME.find().skip(10).limit(100)
当查询时同时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mongo 笔记