关于MongDB
介绍
MongoDB是一个基于分布式 文件存储的NoSQL数据库;旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
NoSQL数据库:泛指非关系型数据库。优点:易扩展,大数据量、高性能,灵活的数据模型,高可用
NoSQL框架体系Nosol整体框架(四层):数据持久层、整体分布层、数据逻辑模型层、接口层
特点
模式自由:可以将不同结构的文档存储到同一个数据库中
面向集合的存储:适合存储JSON风格文件的形式
完整的索引支持:对任何属性都可以索引
复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的目的是提供陈宇及自动故障转移
自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
丰富的查询:支持丰富的查询表达式,查询指令支持JSON形式的标记,可轻易查询文档中的内嵌的对象及数据
快速的更新:查询优化器回分析查询表达式,生成一个高效的查询计划
高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
基本概念
- MongoDB:将数据存储为一个文件,以键值对的形式组成
- 文档类型类似JSON对象,字段值包含其他文档、数组、文档数组
SQL术语 | MongoDB术语 | 解释说明 |
---|---|---|
database | datavase | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
文档,就是一个对象,由键值对构成,是json的扩展Bson形式
MongoDB的使用
安装MongoDB
Windows安装MongoDB
Linux安装MongoDB
Mac安装MongoDB
(这里以Windows为例)
- 启动:
net start MongoDB
- 停止:
net stop MongoDB
- 使用终端连接
mongo
- 终端退出
exit
或ctrl+c
推荐安装MongoDB可视化工具robomongo
- 查看当前数据库名称
db
- 查看当前数据库信息
db.stats()
- 列出所有数据库
show dbs
- 切换数据库
use 数据库名
- 删除当前数据库
db.dropDatabase()
默认数据库为test - 创建数据库集合
db.createCollection([name], [options])
[name]是要创建数据库集合的名字
[options]是一个文档,用于指定集合的配置
可选参数:
capped:默认false,表示不设置集合上限大小,true表示设置上限
size:当capped为true时,需要指定此参数来表示上限大小,超过此上限,会将之前的数据覆盖。单位为字节
db.createCollection('dome', {capped: true, size: 100})
- 查看当前数据库的集合
show collections
- 删除某集合
db.[集合名].drop()
数据类型
数据类型 | 说明 |
---|---|
Object ID | 文档ID |
String | 字符串,必须是有效的UTF-8 |
Boolean | 布尔类型,true或false |
Integer | 整数 |
Double | 浮点数 |
Arrays | 数组或列表,多个值存储到一个键 |
Object | 用于嵌入的文档,一个值为一个文档 |
Null | 存储Null值 |
Timestamp | 时间戳 |
Date | 存储当前日期或时间的UNIX时间格式 |
object ID 保证文档的唯一性,若没有设置,默认提供一个12字节的十六进制数(4位时间戳+3位机器ID+2位进程id+3位增量值)
常用语法
- 增:
db.[集合名称].insert(document)
db.dome.insert({_di: '20191219', name: 'hh', gender:1})
- 删
db.[集合名称].remove(<query>, {justOne: <boolean>})
参数query:可选,删除的文档的条件
参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
db.stu.remove({gender:0}, {justOne:true})
- 改
db.[集合名称].save(document)
db.stu.save({_id:'20191219', 'name':'nihao'})
-
查
find():查询db.[集合名称].find({条件文档})
findOne():查询,只返回一个db.集合名称.findOne({条件文档})
pretty:将结果格式化db.集合名称.find({条件文档}).pretty()
-
更新:
db.[集合名称].update(<query>, <update>, {multi: <boolean>})
参数query:查询条件,相当于sql语句中的where
参数update:更新操作符,相当于sql语句中的set
参数multi:默认是false,表示只更新找到的第一条数据,为true表示把满足条件的文档全部更新
sb.stu.update({'name':'haha'}, {$set: {name:'haha'}})
-
运算符
等于,默认是等于判断,没有运算符
小于$lt
小于或等于$lte
大于$gt
大于或等于$gte
不等于$ne
逻辑与:默认是逻辑与的关系
逻辑或:使用$or
$nin
判断是否在某个范围内
使用//
或$regex
编写正则表达式
使用$where
后面写一个函数,返回满足条件的数据 -
limit()读取指定数量的文档
db.[集合名称].find().limit(NUMBER)
db.stu.find().limit(2)
- skip()跳过指定数量的文档
db.[集合名称].find().skip(NUMBER)
db.stu.find().skip(2)
- 投影
db.[字段名称].find({}, {字段名称:1, ...})
在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段;对于需要显示的字段,设置为1即可,不设置即为不显示
db.stu.find({},{name:1,gender:1})
- 排序
db.[集合名称].find().sort({字段:1, ...})
参数1为升序,-1为降序
db.stu.find().sort({gender:-1,age:1})
- 统计个数
db.[集合名称].find({条件}).count()
或db.[集合名称].count({条件})
db.stu.find({gender:1}).count()
db.stu.count({gender:1})
- 消除重复
db.[集合名称].distinct('去重字段', {条件})
db.stu.distinct('gender', {age:{$gt:18}})