学无止境

少年辛苦终身事,莫向光阴惰寸功。——唐·杜荀鹤《题弟侄书堂》


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