1. MongoDB简介:
- MongoDB属于非关系型数据库,即可以存放xml、json、bson类型的数据;
- MongoDB是一个基于分布式文件存储的数据库。由**C++**语言编写;
- MongoDB是一个内存数据库,数据都是放在内存里的;
- 对数据的操作大部分都在内存中,但mongdb并不是单纯的内存数据库;
- 在高负载的情况下,添加更多的节点,可以保证服务器的性能;
- MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案;
- MongoDB的默认数据库为"db",该数据库存储在data目录中。
- MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
2. MongoDB的特点:
MongoDB将数据存储为一个文档,以一种直观文档的方式来完成数据的存储。数据结构由键值对组成,类似于Javascript中定义的JSON对象;字段值可以包含其他文档、数组及文档数组。
优点:
- 性能优越,快速,在适量级的内存的mongodb的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快;
- 高扩展性,第三方支持丰富,存储的数据格式是json格式,易于扩展;
- 文档结构的存储方式,能够更便捷的获取数据,保证用户的访问速度;
缺点:
- 对数据之间的事务关系支持比较弱(不支持表之间相互连接);
- 占用空间过大;
- 没有成熟的维护工具,开发文档不是很完善;
3. MongoDB的应用场景:
在传统的关系型数据库中(如mysql),数据是以表单为媒介进行存储的,每个表单均拥有纵向的列和横向的行。
对开发者来说,如果是因为业务需要或者项目初始阶段,而导致数据的具体格式无法明确定义的话,mongodb的这一鲜明特性就脱颖而出了。相比传统的关系型数据库。它非常容易被扩展,这也为写代码带来了极大的方便。
不过mongodb对数据之间的事务关系支持比较弱(不支持表之间相互连接),如果业务方面要求比较高的话,不适合使用mongdb。
4. MongoDB的术语:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,mongodb不支持 | |
primary key | primary key | 主键,mongodb自动将_id字段设置为主键 |
mysql(左侧)和mongodb(右侧)数据形式对比:
4.1 collection 集合
集合就是 MongoDB 文档组,类似于关系数据库管理系统(RDBMS)中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
4.2 document 文档
文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子如下:
{name:“wangli”,age:28,sex:“man”,address:“beijing”}
5. MongoDB的数据类型:
- Object ID :Documents 自生成的 _id
- String: 字符串,必须是utf-8
- Boolean:布尔值,true 或者false
- Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
- Double:浮点数 (没有float类型,所有小数都是Double)
- Arrays:数组或者列表,多个值存储到一个键
- Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
- Null:空数据类型 , 一个特殊的概念,None Null
- Timestamp:时间戳
- Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
6. MongoDB的常用命令:
每一个指令后面都可以加help(),查看当前指令的帮助信息。
6.1 数据库常用命令
进入数据库mongo
查看所有的数据库show dbs
创建/切换数据库,有的话就切换,没有的话就创建,创建后自动切换到该数据下use 数据库名称
查看针对db的帮助信息db.help()
查看当前是哪个数据库db.getName()
查看数据库的信息,例如:查看有哪些表db.stats()
查看当前数据库的版本db.version()
查看当前数据库的连接地址db.getMongo()
删除数据库db.dropDatabase()
6.2 Collection集合操作
创建一个集合db.createCollection("集合名称")
查看当前db的所有集合db.getCollectionNames()
查看针对集合的帮助信息db.集合名称.help()
查看去重后的数据db.users.distinct("字段名")
查看集合里有哪些文档db.集合名称.find()
查看集合里文档的长度db.集合名称.find().count()
查询集合里的前n条数据db.集合名称.find().limit(n)
查询第n条之后的数据db.集合名称.find().skip(n)
添加文档db.集合名称.save({JSON数据})
修改文档
第一个参数为要匹配的条件,例如{name:“lili”};
第二个参数为要修改的内容,例如{age:18};
第三个参数表示当查询不到结果时是否将该条内容插入到集合当中,false为不插入,true表示插入;
第四个参数表示如果查询到多条记录的话,是否要全部更新,true为全部更新,false为只更新一条;db.集合名称.update({匹配条件},{$set:{修改后的内容}},createbool,multbool)
删除文档,参数为要删除的匹配项,例如{name:“zhangesan”}db.集合名称.remove({匹配项})
6.3 实际使用:
创建一个名称为myData的数据库use myData
创建一个名称为users的集合db.createCollection("users")
在该集合添加一些文档,字段数可以不一样db.users.save({name:"zhagsan",age:18,sex:"man"})
db.users.save({name:"lisi",age:28,sex:"man",address:"beijing"})
db.users.save({name:"user01",age:20,sex:"woman"})
db.users.save({name:"user01",age:23,sex:"man"})
查看集合里的所有内容,会自动增加_id属性db.users.find()
将年龄为18的数据的name改成zhangsandb.users.update({age:18},{$set:{name:"zhangsan"}},false,true)
删除年龄为28的数据db.users.remove({age:28})
返回name字段不重复的数据db.users.distinct("name")
查询年龄为18的数据db.users.find({age:18})
查询年龄大于22的数据db.users.find({age:{$gt:22}})
$gt大于, $lt小于, $gte 大于等于,$lte 小于等于;
查询年龄大于等于20,小于等于30db.users.find({age:{$gte:20,$lte:30}})
查询name中含有user的数据,模糊查询,匹配为正则表达式db.users.find({name:/user/})
查询name以zhange开始的数据db.users.find({name:/^zhange/})
查询指定列,{} 表示* 匹配所有,1表示展示,0表示不展示db.users.find({},{name:1,age:1})
查询年龄大于23的数据,只展示name和agedb.users.find({age:{$gt:23}},{name:1,age:1,_id:0})
按照年龄进行升序排序,sort里,1表示升序(从小到大),-1表示降序(从大到小)db.users.find({},{name:1,age:1,_id:0}).sort({age:1})
查询指定多个条件db.users.find({name:"zhangsan",age:18})
查询前3条数据db.users.find().limit(3)
返回数据的长度db.users.find().count()
查询5条之后的数据db.users.find().skip(5)
查询第3-5条数据,即跳过2条,取3条数据db.users.find().limit(3).skip(2)
查询年龄等于20或者18的数据db.users.find({$or:[{age:20},{age:18}]})
查询第一条数据db.users.findOne()
查询符合条件的数据长度db.users.find({age:18}).count()