mongodb基础
非关系型数据库
- NoSQL not only sql 非关系型数据库
- nosql 优缺点
- 优点:
- 高扩展性
- 分布式计算
- 低成本
- 架构灵活
- 没有复杂的关系
- 缺点
- 没有标准化
- 有限的查询功能
- 最终一致是不直观的程序
- 四大分类
- 键值
- 列存储数据库
- 文档型数据库
- 图形数据库
-
分布式
- 一个业务分拆多个子业务,部署在不同的服务器
mongodb
- MongoDB 是一个基于分布式,文件存储的NoSQL数据库
- )MongoDB的数据模型是面向文档的,所谓文档是一种类似JSON的结构,简单理解MongoDB这个数据库中存在的是各种各样的Json.
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
- MongoDB特点:
- • 模式自由 :可以把不同结构的文档存储在同一个数据库里
- • 面向集合的存储:适合存储 JSON风格文件的形式
- • 完整的索引支持:对任何属性可索引
- • 复制和高可用性支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
- • 自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
- • 丰富的查询:
- • 快速就地更新:
- • 高效的传统存储方式:
-
基本概念
- MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对 组成。
- MongoDB文档类似于JSON对象,字段值可以包含其他文档、数组、文档数组。
-
SQL和MongoDB术语/概名词对比
- sql数据库mongodb 一样database
- mongo:进入数据库
- show dbs 显示当前数据库列表
- db:查看选择某个数据库
- use test2:选择数据库
- show tables—>show collections 查看数据库表/集合
- db.sub.find({})查看集合的数据
- show document 查看集合的数据
-
MongoDB三元素
- 数据库是仓库,仓库可以存放集合
- 集合(collection)类似于python的列表哎集合中存放文档,
- 文档(document)就是一个对象,由键值构成,是json的宽展bson形式
- 仓库–》集合(数据)—》文档(信息)–》域(字段)
- 查询mongodb 服务器状态命令
- ps -ajx|grep mongod
- 查询状态:sudo systemctl status mongod
- 启动服务端:sudo service mongod start或者sudo systemctl start mongod
- sudo /usr/local/mongodb/bin/mongod –config /etc/mongodb.conf
- 停止服务端:sudo systemctl stop mongod或者sudo service mongod stop
- 重新启动:sudo sysytemctl resatrt mongod或者sudo service mongod restart
-
Mongodb客户端mongo
- 使用mongo 进入 mongodb
- db 查看当前数据库名称
- db.stats()查看当前数据库信息
- exit,ctrl+c退出
- show dbs ()查看所有数据库名称
- use xxx 切换数据库
- • 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建
- use 数据库名称
-
默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中
-
查看当前数据库名称
- db
- 创建数据库集合:use py2;db.createCollection()
- 删除数据库 db.dropDatabase()
- sql删除drop database test3
-
集合(表)操作
- 1.集合创建
- db.createCollection(name, options)
- • name是要创建的集合的名称
- • options是一个文档,用于指定集合的配置
- 不限制集合大小
- db.createCollection(“stu”)
- 2.查看当前数据库的集合
- show collections
- show tables
- 3.删除集合
- db.集合名称.drop()
数据类型
- • Object ID:文档ID,一般系统维护,自己也可以维护
- • objectID是一个12字节的十六进制数
- o ==前4个字节为当前时间戳==
- o ==接下来3个字节的机器ID==
- o ==接下来的2个字节中MongoDB的服务进程id==
- o ==最后3个字节是简单的增量值==
- • String:字符串,最常用,必须是有效的UTF-8
- • Boolean:存储一个布尔值,true或false
- • Integer:整数可以是32位或64位,这取决于服务器
- • Double:存储浮点值
- • Arrays:数组或列表,多个值存储到一个键
- • Object:用于嵌入式的文档,即一个值为一个文档
- • Null:存储Null值
- • Timestamp:时间戳
- • Date:存储当前日期或时间的UNIX时间格式
数据的基本操作
- 插入语法
- db.集合名称.insert(document)
- • 插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId
- 例1 默认分配一个唯一的ObjectId
- db.students.insert({“name”:“gj”,gender:1})
- db.students.insert({“name”:“gj”,“gender”:1})
- 例2也可以自己指定id
- db.students.insert({_id:20180418"name":“gj”,“gender”:1})
- 查看数据:db.集合名.find()
- 查询所有的数据
- db.students.find({})或者db.students.find()
- 更新语法:
- db.集合名称.update({query},{update},{upsert:“boolean”,multi:“boolean”})
- • 参数query:查询条件,类似sql语句update中where部分
- • 参数update:更新操作符,类似sql语句update中set部分
- • 参数upsert :可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- • 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
- 例一默认值更新一条数据,并且结构被修改
-默认值更新一条数据,只修改字段,不破坏数据 db.students.update({name:“八一建军节”},{$set:{name:“十一国庆节”}})
- 全文档找更新找到的第一条,把{name:‘91pro’}对应的这条修改成{name:‘八一建军节’},其他字段全部丢掉
- db.students.update({name:“91pro”},{name:“八一建军节”})
- 指定属性更新,通过操作符$set
- db.students.update({name:“十一国庆节”},{$set:{genger:0}})
- 5:修改多条匹配到的数据把所有性别都改成女
- db.students.update({},{$set:{gender:“女”}},{multi:true})
- 把所有name是潘金莲修改成小飞
- db.students.update({name:“潘金莲”},{$set:{name:“小飞”}},{multi:true})
- 保存语法
- db.集合名称.save(document)
- 如果文档的_id已经存在则修改,如果文档的_id不存在则添加
- 注意,如果_id写成是id,则会把id当成key
- 例1
- db.stu.save({_id:‘20160102’,’name’:‘yk’,gender:1})
- 例2
- db.stu.save({_id:‘20160102’,’name’:‘wyk’})
- save和insert函数的区别
- 相同点:save和insert函数都可以向collection里插入数据。
- 区别:
- 一、使用save()函数,如果原来的对象不存在,那他们都可以向collection里插入数据,如果已经存在,save会调用update更新里面的记录,而insert则会忽略操作,并且提示报错。
- 二、insert可以一次性插入一个列表,而不用遍历,效率高, save则需要遍历列表,一个个插入。
- 删除语法
- db.集合名称.remove({query},{justOne:{boolean}})
- • 参数query:可选,删除的文档的条件
- • 参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
- 只删除匹配到的第一条
- db.students.remove({“name”:“小飞”},{“justOne”:“true”})
- 全部删除
- db.students.remove({})
-
关于max的示例
- 创建一个名为sub的定长集合,长度为5个字节,可容纳的文档数为3
- db.createCollection(“sub”,{capped:true,size:5,max:3})
- capped:封顶结合size,max:3就是当第3条数据时,再插入数据覆盖之前插入的第1条数据给覆盖了,也就是说最多数据不能超过3条,也就是说数据只能存放3条。
- 插入数据
- db.sub.insert({“title”:“html5”,“count”:27})
- db.sub.insert({“title”:“python基础”,“count”:14})
- db.sub.insert({“title”:“python高级”,“count”:14})
- db.sub.insert({“title”:“liunx”,“count”:2})
-
注意在命令行中,会插入不进去,不会覆盖。
八、数据查询
-
基本查询
-
• 方法find():查询
-
db.集合名称.find({条件文档})
-
• 方法findOne():查询,只返回第一个文档
-
db.集合名称.findOne({条件文档})
-
• 方法pretty():将结果格式化
-
db.集合名称.find({条件文档}).pretty()
-
比较运算符
-
• 等于,默认是等于判断,没有运算符对应equal ,意思是等于,缩写e;
-
• 小于$lt 计算机术语里面是 less than,意思是小于,缩写是lt
-
• 小于或等于$lte
-
• 大于$gt对应 greater than,意思是大于,缩写是gt ;
-
• 大于或等于$gte
-
• 不等于$ne 对应 Not equal to,意思是不等于,缩写ne;
-
:查询标题等于’sql’的学科
-
db.sub.find({“title”:“sql”})
-
不等于db.sub.find({“title”:{$ne:“sql”}})
-
例2:查询课时大于或等于2的学科
-
db.sub.find({count:{$gte:2}})
-
查找标题不是mongo的学科
-
db.sub.find({title:{$ne:‘mongodb’}})
-
逻辑运算符
-
•查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
-
•逻辑与:默认是逻辑与的关系,多个条件直接用逗号连接
-
• 逻辑或:使用$or
-
• and和or一起使用
-
逻辑与默认是逻辑与的关系,多个条件直接用逗号连接
-
询课时大于或等于10,并且标题为web的学科
-
db.sub.find({“count”:{"$gte":10},“title”:“web”})
-
逻辑或:使用$or
-
查询课时大于10,或标题为web的学科
-
db.sub.find({"$or":[{“count”:{"$gt":10}},{“title”:“web”}])
-
and和or一起使用
-
•例5:查询课时大于10或标题为web的学科,并且学科的课时为14
范围运算符–"$in"
- 语法
- • 使用"$in","$nin" 判断是否在某个范围内
- 例6:查询课时为8、14的学科
- db.sub.find({“count”:{"$in":[8,14]}})
- 不是
- db.sub.find({“count”:{"$nin":[8,14]}})
-
Limit与Skip
- limit• 方法limit():用于读取指定数量的文档
- db.集合名称.find().limit(NUMBER)
- • 参数NUMBER表示要获取文档的条数
- • 如果没有指定参数或者0则显示集合中的所有文档
- • 例1:查询2条学生信息
- db.sub.find({}).limit(2)
- skip• 方法skip():用于跳过指定数量的文档
- db.集合名称.find().skip(NUMBER)
- • 参数NUMBER表示跳过的记录条数,默认值为0