NoSQL简介
NoSQL,全名为Not only SQL,指的是非关系型数据库。主要作用就提高检索数据的速度,减少用户等待时间。
NoSQL数据库结构
MongoDB简介
MongoDB是一个基于分布式,文件存储的NoSQL数据库。
由C++语言编写,运行稳定,性能高。
皆在为WEB应用提供可扩展的高性能数据库存储解决方案。
关系型SQL和MongoDB的对比
SQL术语 | MongoDB术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 行记录/文档 |
column | field | 字段/域 |
index | index | 索引 |
table joins | 表连接,mongodb不支持 | |
primary key | primary key | 主键/MongoDB自动将_id字段设置为主键 |
MongoDB三元素:数据库、集合、文档。
- 集合就是关系型数据库中的表。
- 文档对应着关系型数据库中的行。
文档:就是一个对象,由键值对构成,是json的扩展Bson形式。
例如
{'name': 'zhangsan', 'gender': '男'}
集合:存储多个文档,结构不固定。
例如
{'name': 'zhangsan', 'gender': '男'}
{'name': 'lisi', 'gender': '男', 'age': 18}
{'course': '语文', 'score': 80}
数据库:是一个集合的物理容器,一个数据库可以包含多个集合
数据库操作方法
- 查看当前数据库名称
db
- 查看所有数据库名称
show dbs
- 切换数据库,如果数据库不存在,则指向数据库,但不创建,直到插入数据库或创建集合时数据库才被创建
use 数据库名称
- 删除当前指向的数据库,如果数据库不存在,则什么也不做
db.dropDatabase()
集合操作方法
- 创建集合
db.createCollection(name, options)
- name是要创建的集合名称
- options可选参数,是一个文档,用于指定集合的配置。
- 例子1:不带参数
db.createCollection("test")
- 例子2:限制集合大小。
db.createCollection("test", {capped : true, size : 10})
- 参数cappend:默认值为false表示不设置上限,true表示设置上限。
- 参数size:当capped值为true时,需要指定此参数,表示设置上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节。
- 查看当前数据库的集合
show collections
- 删除集合
db.集合名称.drop()
MongoDB常用的几种数据类型
数据类型 | 说明 |
---|---|
Object ID | 文档ID |
String | 字符串,最常用,必须是有效的UTF-8 |
Booolean | 存储一个布尔值,true或false |
Integer | 整数可以是32位或者64位,取决于服务器 |
Double | 存储浮点值 |
Arrays | 数组或列表 |
Object | 用于嵌入式的文档,即一个值为一个文档。例如{ 'key' : {'key1' : vaule, 'key2' : 'value'} }
|
Null | 存储Null值 |
Timestamp | 时间戳 |
Date | 存储当前日期或时间的UNIX时间格式 |
Object ID
- 每个文档都有一个属性为_id,保证每个文档的唯一性。
- 可以自己设置_id插入文档
- 如果没有提供,那么Mongodb为每个文档提供一个独特的_id,类型为objectID
- objectID是一个12字节的十六进制数
- 前4个字节为当前时间戳
- 接下来3个字节为机器ID
- 接下来的2个字节为MongoDB的服务器进程ID
- 最后3个字节是简单的增量值
数据操作方法
-
插入文档
db.集合名称.insert(document)
- 插入文档时,如果不指定_id参数,Mongodb会为文档自动分配一个唯一的ObjectID
- 例1
db.test.insert({name: 'zs', age : 18})
- 例2
db.test.insert({_id : 20181014,'name' : 'zs', age : 18})
-
查询文档
db.集合名称.find()
-
更新文档
db.集合名称.update(<query>, <update>, {multi: <boolean>})
- 参数query:查询条件,类似sql语句update中where部分。
- 参数update:更新操作符,类似sql语句update中set部分。
- 参数multi:默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新。
- 通过操作符$set可以修改指定的值。如果不加$se修改的是整个文档
- 例1:把name为zs的文档更新为abc值为111
db.test.update({'name' : 'zs'}, {'abc' : '111'})
- 例2:把name为zs更新为lisi
db.test.update({'name' : 'zs'}, {$set:{'name' : 'lisi'}})
例1修改的是整个文档,例2只修改文档name的值。
-
删除文档
db.集合名称.remove(<query>, {justOne : <boolean>})
- 参数query:可选,删除文档的条件
- 参数justOne:可选,如果设为true或1,则只删除一条,默认false。
例1:删除匹配到的第一条
db.test.remove({name : 'lisi'}, {justOne : true})
例2:全部删除
db.test.remove({})
查询
- find()方法:查询
db.集合名称.find({条件文档})
- findOne()方法:查询,只返回第一个
db.集合名称.findOne({条件文档})
- pretty()方法:将结果格式
db.集合名称.find({条件文档}).pretty()
- limit()方法:用于读取指定数量的文档
db.集合名称.find().limit(1)
- skip()方法:用于跳过指定数量的文档
- 例1:查询从第3条开始的学生信息
db.集合名称.find().skip(2)
- 例2:查询第5到8条数据
db.集合名称.find().skip(4).limit(4)
- 例1:查询从第3条开始的学生信息
- sort()方法:用于对结果集进行排序
db.集合名称.find().sort({字段:1})
- 参数1为升序,-1为降序
- count()方法:用于同级结果集中的文档条数
db.集合名称.find().count()
distinct()方法:对数据进行去重
db.集合名称.distinct('去重字段',{条件})
比较运算符
运算符 | 说明 |
---|---|
: | 等于,默认是等于判断符 |
$lt | 小于 |
$lte | 小于或等于 |
$gt | 大于 |
$gte | 大于或等于 |
$ne | 不等于 |
$in | 在范围内 |
$nin | 不在范围内 |
例1:查询名称等于lisi的学生
db.tset.find({name: 'lisi'})
例2:查询年龄大于或等于18的学生
db.test.find({age: {$get: 18}})
例3:查询年龄为18、28的学生
db.test.find({age: {$in:[18, 28]}})
逻辑运算符
运算符 | 说明 |
---|---|
, | 与,默认是逻辑与的关系 |
$or | 或 |
例1:查询年龄大于或等于18,并且性别是1的学生
db.test.find(age: {$gte: 18}, gender: 1)
例2:查询年龄大于18,或者性别为0的学生
db.test.find({$or: [{age: {$gt: 18}}, {gender: 0}]})
支持正则表达式
- 使用/.../或$regex编写正则表达式
- 例如:查询姓张的学生
db.test.find({name: /^张/})
db.test.find({name: {$regex: '^张'}})
支持js语法自定义查询
- 使用$where后面写一个函数,返回满足条件的数据。
- 例如:查询年龄大于20的学生
db.test.find({$where: function(){return this.age>20}})
投影
- 在查询到的结果中,只选择必要字段,而不是一个文档的所有字段。
- 如:一个文档有5个字段,需要显示只有2个,投影其中2个字段即可
- 语法
db.集合名称.find({文档}, {字段名称: 1,...})
- find()方法的第二个参数为字段与值,值为1表示显示,值为0表示不显示,不设置即为不显示
- 特殊:对于_id列默认是显示的,如果不显示需要明确设置为0
- 例1:只显示name字段
db.test.find({}, {name: 1, _id: 0})
网友评论