MongoDB的安装到使用 + Python操作MongoDB + 有关系和无关系数据库比较

  1. day1 - day7 mongoDB学习第一天
    数据库 MongoDB (芒果数据库)
    数据存储阶段
    文件管理阶段 (.txt .doc .xls)
    优点 : 数据可以长期保存
    可以存储大量的数据
             使用简单
    缺点 : 数据一致性差
    数据查找修改不方便
             数据冗余度可能比较大
    数据库管理阶段
    优点 : 数据组织结构化降低了冗余度
    提高了增删改查的效率
             容易扩展
             方便程序调用,做自动化处理
    缺点 :需要使用sql 或者 其他特定的语句,相对比较复杂
    几个概念
    数据 : 能够输入到计算机中并被识别处理的信息集合
    数据结构 :研究一个数据集合中数据之间关系的
    数据库 : 按照数据结构,存储管理数据的仓库。数据库是在数据库 管理系统管理和控制下,在一定介质上的数据集合。
    数据库管理系统 :管理数据库的软件,用于建立和维护数据库
    数据库系统 : 由数据库和数据库管理系统,开发工具等组成的集合
    关系型数据库
    采用关系模型来组织数据结构的数据库 (二维表)
    Oracle DB2 SQLServer MySql SqLite(Python标准库支持)
    优点 :容易理解,类似我们常见的表格
    使用方便,都是使用sql语句,SQL语句非常成熟
    数据一致性高,冗余度低,完整性好
    技术成熟,可以使用外部链接等比较复杂的操作
    缺点 :不能很好的满足高并发需求,每次都需要进行sql语句的解析
    针对含量数据的瞬间爆发读写性能不足,关系型数据库内部每步操作都需要加锁保证操作的原子性
    数据扩展普遍比非关系型困难
    数据一致性高,有时会浪费大量空间
    非关系型数据库 (NoSql --> Not only Sql)
    优点 : 高并发,大数据读写能力强
    支持分布式,容易扩展
             弱化了数据结构,降低了数据的一致性
    缺点 : 通用性差,没有像sql那样一致的操作
    操作灵活,容易混乱
             没有join,有的数据库事务支持等操作
    Nosql的使用情况:
  2. 数据一致性要求低
  3. 数据库并发处理要求高
  4. 数据库设计时对大小的估算不确定,需要分布拓展
  5. 给定的数据比较容易建立起Nosql的模型
    Nosql分类:
  6. 键值型数据库
    Redis oracle BDB Tokyo
  7. 列存储数据库
    HBase
  8. 文档型数据库
    MongoDB CouchDB
  9. 图形数据库
    MongoDB(非关系型 --》文档型数据库)
  10. 由c++编写的数据库管理系统
  11. 支持非常丰富的增删改查数据操作
  12. 支持非常丰富的数据类型
  13. 使用方便,便于部署,支持分布,容易拓展
  14. 支持众多的编程语言接口 (python ruby c++ c# PHP)
    MongoDB 安装
    自动安装
    sudo apt-get install mongodb
    默认安装位置 /var/lib/mongodb
    配置文件 /etc/mongodb.conf
    命令集 /usr/bin /usr/local/bin
    手动安装
    1.下载MongoDB (开源)
    www.mongodb.com —》 Download —》 community server
    选择合适版本下载
  15. 选择安装目录解压 (/usr/local /opt)
    tar解压后得到mongo文件夹
  16. 将文件夹下的命令集目录 (bin目录)添加到环境变量
    PATH=$PATH:/opt/mongo…/bin
    export PATH
    将以上两句写在 /etc/rc.local
    4.重启系统
    mongodb 命令
    设置数据库存储位置
    mongod --dbpath 目录
    设置端口号
    mongod --port 8888
    *如果不设置则使用默认端口号 27017
    mongo
    进入mongo shell界面 mongodb的交互界面用来操作数据库
    退出 mongo shell : quit()
    组成结构: 键值对 —》 文档 ----》集合 ----》 数据库

ID | name | age


1 | Lily | 17


2 | Lucy | 18


{
“_id”:ObjectId(“abcd1234afhkasyr”),
“name”:“Lily”,
“age”:17
},
{
“_id”:ObjectId(“abcd1234afasfsyr”),
“name”:“Lucy”,
“age”:18
}
mysql 和 mongodb 概念对比
mysql mongo 含义
database database 数据库
table collection 表/集合
column field 字段/域
row document 记录/文档
index index 索引
创建数据库
use databasename
e.g.
创建一个叫 stu 的数据库
use stu

  • use实际功能是表示选择使用哪个数据库,当这个数据库不存在时即表示创建该数据库
  • 使用use后数据库并不会马上被创建,而是需要插入数据后数据库才会创建
    查看数据库
    show dbs
    数据库名称规则
  1. 原则上是任意满足以下几条的utf-8字符
  2. 不能是空字符,不能含有空格’ ’ 点’.’ ‘/’ ‘’ ‘\0’
  3. 习惯上使用英文小写
  4. 长度不超过64字节
  5. 不能使用 admin local config 这样的名字
    admin : 存储用户
    local : 存储本地数据
    config : 存储分片配置信息
    db : mongo系统全局变量 代表你当前正在使用的数据库
    db 默认为test 如果插入数据即创建test数据库
    数据库的备份和恢复
    备份 mongodump -h dbhost -d dbname -o dbdir
    e.g. mongodump -h 127.0.0.1 -d stu -o student
    将本机下 stu 数据库备份到 当前目录的student文件夹中
    会在student文件夹中自动生成一个stu文件夹则为备份文件
    恢复 mongorestore -h : -d dbname
    e.g. mongorestore -h 127.0.0.1:27017 -d test student/stu
    将student文件夹下的备份文件stu恢复到本机的test数据库
    数据库的监测命令
    mongostat
    insert query update delete :每秒增查改删的次数
    getmore command 每秒运行命令次数
    dirty used flushes 每秒操作磁盘的次数
    vsize res 使用虚拟内存和物理内存
    mongotop
    监测每个数据库的读写时长
    ns total read write
    数据集合 总时长 读时长 写时长
    删除数据库
    db.dropDatabase()
    删除db所代表的数据库
    集合的创建
    db.createCollection(collection_name)
    e.g. db.createCollection(“class2”)
    在当前数据库下创建一个名字为class2的集合
    查看数据库中集合
    show tables
    show collections
    集合的命名规则:
  6. 不能为空字符串,不能有’\0’
  7. 不能以 system.开头 这是系统集合的保留前缀
  8. 不能和保留字重复
    创建集合2
    当向一个集合中插入文档时,如果该集合不存在则自动创建
    db.collectionName.insert()
    e.g. db.class0.insert({a:1})
    如果class0不存在则会创建class0集合并插入该数据
    删除集合
    db.collectionName.drop()
    e.g. db.class0.drop()
    删除class0集合
    集合重命名
    db.collectionName.renameCollection(‘new_name’)
    e.g. db.class2.renameCollection(‘class0’)
    将class2重命名为class0
    文档
    mongodb 中文档的组织形式
    键值对组成文档 -----》 类似Python中的字典
    bson -----》 json -----》 JavaScript
    mongodb 中文档的数据组织形式为bson格式,类似Python的字典,也是由键值对构成
    文档中键的命名规则 :
  9. utf-8格式字符串
  10. 不用有\0 习惯上不用 . 和 $
  11. 以_开头的多位保留键,自定义时一般不以_开头
    注意 : 文档键值对是有序的
    mongodb中严格区分大小写
    值 : mongodb的支持数据类型
    支持的数据类型
    类型 值
    整型 整数
    布尔类型 true false
    浮点型 小数
    Arrays 数组类型 [1,2,3]
    Timestamp 时间戳
    Date 时间日期
    Object 内部文档
    Null 空值
    Symbol 特殊字符
    String 字符串
    Binary data 二进制字串
    code 代码
    regex 正则表达式
    ObjectId ObjectId子串
    ObjectId : 系统自动为每个文档生成的不重复的主键
    键名称: _id
             值 : ObjectId(“5b03b823e64cb5d90e9c8f5c”)
    24位16进制数
    8 文档创建时间 6机器ID 4进程ID 6计数器
    文档中键 -----》 域/字段
    文档 – ----》 记录
    集合中文档特点:
  12. 集合中的文档域不一定相同 —》不保证数据一致性
  13. 集合中的文档结构不一定相同
    集合设计原则:
    1.集合中的文档尽可能描述的数据类似
    2.同一类文档放在相同的集合,不同的文档分集合存放
    3.层次的包裹不宜太多
    插入文档
    db.collectionName.insert()
    e.g.
    db.class0.insert({name:‘Lucy’,age:16,sex:‘w’})
  • 当作为文档插入时键可以不加引号
    查看插入结果 db.class0.find()
    插入多条文档
    db.collectionName.insert([{},{},{}])
    e.g. db.class0.insert([{‘name’:‘阿花’,age:28},{name:‘阿红’,age:26},{name:‘阿彪’,age:23}])
  • _id 为系统自动添加主键,如果自己写_id域则会使用自己写的值。但是该值仍不允许重复。
    save 插入数据
    db.collectionName.save()
    e.g.
    db.class0.save({_id:2,name:‘八戒’,age:17,sex:‘m’})
  • 在不加_id是使用同 insert
  • 如果使用save插入的时候加了_id,则如果_id值不存在则正常插入,如果该值存在,则修改原来内容
  • save无法一次插入多个文档
    作业 : 练习mongodb的数据库,集合创建删除
    mongodb 插入练习
             关系型数据库和非关系数据库都有什么特点?
             mongodb的优点在哪里?
    ************************************************************第二天
    复习 :
    数据库创建删除: use 数据库名称
    db.dropDatabase()
    集合的创建和删除 db.createCollection(‘name’)
    db.collectionName.insert()
                      db.collectionName.drop() 删除
                      db.collectionName.renameCollection() 重命名
    数据库的备份和恢复
             mongodump (备份) mongorestore(恢复)
    数据库的监测
    mongostat mongotop
    数据库配置
    mongod --dbpath path --port 8888
    数据的插入 : insert() save()
    =====================================
    db.collectionName 集合对象
    获取集合对象 : db.getCollection(‘collection_name’)
    e.g.
    db.getCollection(“class0”).insert({name:‘悟空’,age:1700})
    查找操作
    select … from tableName where …
    db.collectionName.find() —> select * from tableName
    find(query,field)
    功能 : 查找所有符合条件的文档
    参数 : query : 筛选条件 相当于where字句
    field : 展示的域 相当于select的展示部分
    返回 : 返回所有查找到的内容
    field 参数 : 选择要展示的域 传一组键值对
    键表示域名
    值表示是否显示该域 0 表示不显示 1 表示显示
  • 如果某个域给定0 则表示不显示该域,其他的域均显示
    如果某个域给定1 则表示显示该域 ,其他的域都不显示
  • _id 永远默认为显示,除非设置为0
  • 除_id外其他域 必须拥有相同的设置,全为0或者全为1
  • 如果不写该参数则表示显示所有域内容
    e.g. db.class0.find({},{_id:0,name:1,age:1})
    query : 以键值对的形式给出查找条件
    查找年龄 17
    e.g. db.class0.find({age:17},{_id:0})
  • 如果不写第一个参数则表示查找所有内容
    findOne()
    功能参数和find() 完全相同,只是只返回第一条查找到的文档
    e.g. db.class0.findOne({age:17},{_id:0})
    query的更多用法
    操作符: 使用$符号注明一个特殊字符串,表示一定的含义
    e.g. $lt 表示 小于
    比较操作符
    $eq 等于
    e.g. db.class0.find({age:{$eq:17}},{_id:0})
    筛选年龄等于17的
    =====》 db.class0.find({age:17},{_id:0})
    $lt 小于 <
    e.g. db.class0.find({age:{$lt:17}},{_id:0})
  • mongo中字符串也可以比较大小
    $lte 小于等于 <=
    e.g. db.class0.find({age:{$lte:17}},{_id:0})
    $gt 大于 >
    e.g. db.class0.find({age:{$gt:17}},{_id:0})
    $gte 大于等于 >=
    e.g. db.class0.find({age:{$gte:17}},{_id:0})
    $ne 不等于 !=
    e.g. db.class0.find({age:{$ne:17}},{_id:0})
  • 如果一个文档没有这个age域则显示为不等于
    $in 包含
    e.g. db.class0.find({age:{$in:[16,17,18]}},{_id:0})
    $nin 不包含
    e.g. db.class0.find({age:{$nin:[16,17,18]}},{_id:0})
    逻辑操作符
    $and 逻辑与
    年龄小于19 并且 性别为男
    db.class0.find({age:{$lt:19},sex:‘m’},{_id:0})
    年龄小于19 并且 大于15
    db.class0.find({age:{$lt:19,$gt:15}},{_id:0})
    e.g. db.class0.find({$and:[{age:17},{name:‘Lei’}]})
    $or 逻辑或
    e.g.
    db.class0.find({$or:[{age:{$lt:22}},{name:‘悟空’}]},{_id:0})
    db.class0.find({$or:[{age:{$lt:18}},{age:{$gt:30}}]},{_id:0})
    $not 逻辑非
    e.g. db.class0.find({age:{$not:{$eq:17}}},{_id:0})
    $nor 既不也不 (表示列表集合中的条件都不具备)
    db.class0.find({$nor:[{age:{$gt:18}},{sex:‘m’}]},{_id:0})
    条件混合
    (年龄小于20 或者 姓名为阿红) 并且 性别为女的人
    db.class0.find({$and:[{$or:[{age:{$lt:20}},{name:‘阿红’}]},{sex:‘w’}]},{_id:0})
    年龄小于等于17 或者 (姓名大于Tom 并且 年龄大于100)
    db.class0.find({$or:[{age:{$lte:17}},{name:{$gt:‘Tom’},age:{$gt:100}}]},{_id:0})
    数组查找 :
    查看数组中包含某一项的
    e.g. db.class1.find({hobby:‘吃’},{_id:0})
    $all
    查找一个数组中同时包含多项的文档
    e.g. db.class1.find({hobby:{$all:[‘拍电影’,‘代言’]}},{_id:0})
    查找hobby数组中既有拍电影,又有代言的文档
    $size
    查找数组元素个数为指定个数的文档
    e.g. db.class1.find({hobby:{$size:3}},{_id:0})
    查找hobby数组中包含三项的文档
    数组切片显示
    $slice
    对数组切片显示
    e.g.
    db.class1.find({hobby:{$size:3}}, {_id:0, hobby:{$slice:2}})
    显示数组的前两项
    e.g.
    db.class1.find({hobby:{$size:3}}, {_id:0, hobby:{$slice:[1,2]}})
    跳过第一项,显示后面两项
    其他查找方法:
    $exists
    判断一个域是否存在
    e.g. 查找存在sex域的文档
    db.class0.find({sex:{$exists:true}},{_id:0})
    e.g. 查找不存在sex域的文档
    db.class0.find({sex:{$exists:false}},{_id:0})
    $mod
    做除数余数查找
    e.g.
    查找年龄 被2除余1的文档
    db.class0.find({age:{$mod:[2,1]}},{_id:0})
    $type
    查找指定数据类型的文档
    e.g. 查找hobby中包含数据类型为 2 的数据的文档
    db.class1.find({hobby:{$type:2}},{_id:0})
    数据类型对照:
    https://docs.mongodb.com/manual/reference/operator/query/type/
    进一步的信息筛选
    distinct()
    功能 : 查看一个集合中某个域值的覆盖范围
    e.g. 查看集合中age域的值都有哪些
    db.class0.distinct(‘age’)
    pretty()
    功能 : 将查询结果格式化显示
    e.g. db.class0.find().pretty()
    limit(n)
    功能: 查询结果显示前 n条
    e.g. 查询结果显示前3个
    db.class0.find({},{_id:0}).limit(3)
    skip(n)
    功能 : 显示时跳过前n条
    e.g. 显示时跳过前三条
    db.class0.find({},{_id:0}).skip(3)
    count()
    功能 :对查找结果计数统计
    代理:30 * 10000 27 - 28
    e.g. 统计sex 为 m的文档数量
    db.class0.find({sex:‘m’},{_id:0}).count()
    sort({键:1/-1})
    功能 : 对查找结果排序
    1 表示按照升序排列, -1 表示按照降序排列
    对查找结果按照年龄升序排列
    db.class0.find({age:{$exists:true}}, {_id:0}).sort({age:1})
    复合排序 : 当第一排序项相同的时候,按照第二排序项排序
    db.class0.find({age:{$exists:true}},{_id:0}).sort({age:1,name:-1})
    函数的连续使用
    获取集合中年龄最小的三个文档
    db.class0.find({},{_id:0}).sort({age:1}).limit(3)
    删除文档
    delete from tableName where …
    db.collectionName.remove(query,justOne)
    功能 : 删除指定的文档
    参数 : query : 筛选要删除的文档, 类似where子句。
    用法同 查找操作。
             justOne :布尔值 默认 false 表示删除所有筛选数据。
             如果赋值为true 则表示只删除第一条复合的文档。
    e.g.
    db.class0.remove({$or:[{age:{$exists:false}},{age:{$gt:100}}]})
    删除第一个复合条件的文档
    db.class0.remove({sex:{$exists:false}},true)
    删除集合中所有文档
    db.collectionName.remove({})
    练习:
  1. 创建一个数据库 名字grade
    use grade
  2. 数据库中创建一个集合名字 class
  3. 集合中插入若干数据 文档格式如下
    {name:‘zhang’,age;10,sex:‘m’,hobby:[‘a’,‘b’,‘c’]}
    hobby: draw sing dance basketball football pingpong
    computer
    db.class.insert([
    {name:“zhang”,age:10,sex:‘m’,hobby:[‘a’,‘b’,‘c’]},

    ])
  4. 查找练习
    查看班级所有人信息
    find()
    查看班级中年龄为8岁的学生信息
    find({age:8})
    查看年龄大于10岁的学生信息
    find({age:{$gt:10}})
    查看年龄在 4—8岁之间的学生信息
    find({age:{$gte:4,$lte:8}})
    找到年龄为6岁且为男生的学生
    find({age:6,sex:‘m’})
    找到年龄小于7岁或者大于10岁的学生
    find({$or:[age:{$lt:7},age:{$gt:10}]})
    找到年龄是8岁或者11岁的学生
    find({age:{$in:[8,11]}})
    找到兴趣爱好有两项的学生
    find({hobby:{$size:2}})
    找到兴趣爱好有draw的学生
    find({hobby:“draw”})
    找到既喜欢画画又喜欢跳舞的学生
    find({hobby:{$all:[“draw”,“dance”]}})
    统计爱好有三项的学生人数
    find({hobby:{$size:3}}).count()
    找出本班年龄第二大的学生
    find().sort({age:-1}).skip(1).limit(1)
    查看学生的兴趣范围
    db.class.distinct(‘hobby’)
    将学生按年龄排序找到年龄最大的三个
    find().sort({age:-1}).limit(3)
    删除所有 年级大于12或者小于4岁的学生
    remove({$or:[{age:{$gt:12}},{age:{$lt:4}}]})
    作业 : 复习 数据的查找 和删除操作
    mongo练习

第三天
查找 find(query,field)
findOne()
操作符 : 比较 $lt $lte $gt $gte $eq $ne $in $nin
逻辑 $and $or $not $nor
         数组 $all $size
         其他 $exists $type $mod
查找函数 : limit() skip() sort() count() pretty()
其他函数 distinct() getCollection()
删除 remove(query,justOne)

修改数据
update tableName set … where …
db.collectionName.update(query,update,upsert,multi)
功能 : 修改一个文档
参数 : query : 删选要修改的文档 相当于where子句
用法同查找
         update : 将数据更新为什么内容 相当于set操作
         需要使用修改器操作符
         upsert : bool值 默认为false 表示如果query的文档不 存在则无法修改
         如果设置为true 表示如果query的文档不存在则根据query和update参数插入新的文档
         multi : bool值 默认为false 如果有多条符合筛选条件 的文档则只修改第一条
         如果设置为true 则修改所有符合条件的文档
e.g. 将阿红年龄改为24
db.class0.update({name:‘阿红’},{$set:{age:24}})
e.g. 如果筛选数据不存在则插入一个新的文档
db.class0.update({name:‘阿花’},{$set:{age:18,sex:‘w’}},true)
e.g. 可以同时修改多条匹配到的文档
db.class0.update({sex:‘w’},{$set:{age:20}},false,true)
修改器操作符
$set
修改一个域的值
增加一个域
e.g. db.class0.update({name:‘阿红’},{$set:{sex:‘w’}})
$unset
删除一个域
e.g. 删除文档的sex和age域 (后面数字习惯写1,0 都表示删除)
db.class0.update({name:‘八戒’},{$unset:{sex:0,age:0}})
$rename
修改一个域的名称
e.g. 修改所有的sex域为gender
db.class0.update({},{$rename:{sex:‘gender’}},false,true)
$setOnInsert
如果update操作插入新的文档,则补充插入内容
e.g. 如果插入数据则同时插入sex和tel域内容
db.class0.update({name:‘阿华’},{$set:{age:21},$setOnInsert:{sex:‘m’,tel:‘123456’}},true)
$inc
加减修改器
e.g. 年龄减2
db.class0.update({age:{$lt:18}},{$inc:{age:-2}},false,true)

  • $inc 可加正数 负数 小数都可以
    $mul
    乘法修改器
    e.g.
    db.class0.update({name:‘阿华’},{$mul:{age:-0.5}})
  • $mul 可乘以正数 负数 小数都可以
    $min
    设定最小值 : 如果筛选的文档指定的域值小于min值则不修改,如果大于min值则改为min值
    e.g.
    db.class0.update({},{$min:{age:19}},false,true)
    $max
    设置最大值 : 如果筛选的文档指定至于大于max值则不变,如果小于max值则修改为max值
    e.g.
    db.class0.update({},{$max:{age:20}},false,true)
    数组修改器
    $push 向数组中添加一项
    e.g.
    db.class1.update({name:“Abby”},{$push:{score:30}})
    $pushAll 向数组中添加多项
    e.g.
    db.class1.update({name:“Jame”},{$pushAll:{score:[10,20]}})
    $each 逐个操作
    e.g. 利用each添加多项
    db.class1.update({name:“Lily”},{$push:{score:{$each:[10,5]}}})
    $position
    选择数据位置进行操作 必须和each合用
    e.g.
    db.class1.update({name:“Lucy”},{$push:{score:{$each:[10,10],$position:1}}})
    $sort
    对数组进行排序 必须和each合用
    e.g.
    db.class1.update({name:“Lily”},{$push:{score:{$each:[],$sort:1}}})
    $pull 从数组中删除一个元素
    e.g.
    db.class1.update({name:‘Lucy’},{$pull:{score:10}})
    $pullAll 从数组中删除多个元素
    e.g.
    db.class1.update({name:‘Jame’},{$pullAll:{score:[10,20]}})
    $pop 弹出数组中的一项
    e.g.
    db.class1.update({name:‘Lily’},{$pop:{score:-1}})
  • -1表示弹出数组中的第一项 1 表示弹出最后一项
    $addToSet 向数组中插入一个元素,但是该元素不能和其他元素重复
    e.g. 如果已经存在66则无法插入,如果不存在则插入66
    db.class1.update({name:‘Lily’},{$addToSet:{score:66}})
    数据类型补充
    时间类型
    mongo中存储时间的格式 :ISODate
    方法1 自动生成当前时间
    db.class2.insert({title:‘Python入门’,date:new Date()})
    方法2 生成当前时间
    db.class2.insert({title:‘Python精通’,date:ISODate()})
    方法3 将生成时间变为字符串存储
    db.class2.insert({title:‘Python AI’,date:Date()})
    指定时间的转换
    ISOData()
    功能 : 生成mongo时间类型
    参数 : 如果不加参数则生成当前时间
    参数格式 “2018-11-11 11:11:11”
             “20180101 11:11:11”
                      “20181102”
    e.g.
    db.class2.insert({title:‘Python 爬虫’,date:ISODate(“20180101 11:11:11”)})
    时间戳获取
    e.g.
    db.class2.insert({title:‘PythonWeb’,date:ISODate().valueOf()})
    null
  1. 如果某个域存在却没有值可以设置为null
    e.g. db.class2.insert({title:‘Python 秘籍’,price:null})
    2.表示某个域不存在可以通过null进行匹配
    e.g. db.class2.find({date:null},{_id:0})
    可以查找到date不存在的文档
    Object类型 (值是一个文档)
    *当使用外层文档引用内部文档的时候可以用用 . 的方法引用
    在使用时需要加上引号
    e.g.
    db.class2.find({‘publication.publisher’:‘人民教育’},{_id:0})
    e.g.
    db.class2.update({title:‘Python数据’},{$set:{‘publication.price’:58.8}})
    数组的下标引用
    使用一个数组时,可以使用 .序列下标 的方式使用数组具体的某一项。同样需要用引号
    e.g. db.class1.update({name:‘Lily’},{$set:{‘score.0’:60}})
    e.g. db.class1.find({‘score.0’:{$gt:90}})
    文档查找结果的有序性
    可以通过[]取查找结果序列的某一项
    db.class1.find({},{_id:0})[1]
    练习 :
    使用之前的grade数据库
  2. 将小红的年龄变为8岁 兴趣爱好变为 跳舞 画画
    {$set:{age:8,hobby:[‘dance’,‘draw’]}}
  3. 追加小明兴趣爱好 唱歌
    {$push:{hobby:‘sing’}}
  4. 小王兴趣爱好增加 吹牛 打篮球
    {$pushAll:{hobby:[‘吹牛’,‘basketball’]}}
  5. 小李增加爱好,跑步和唱歌,但是不要和以前的重复
    {$addToSet:{hobby:{$each:[‘running’,‘sing’]}}}
  6. 该班所有同学年龄加1
    update({},{$inc:{age:1}},false,true)
  7. 删除小明的sex属性
    {$unset:{sex:0}}
  8. 删除小李兴趣中的第一项
    {$pop:{hobby:-1}}
  9. 将小红兴趣中的画画爱好删除
    {$pull:{hobby:‘draw’}}
    索引
    指的是建立指定键值及所在文档中存储位置的对照清单。使用索引可以方便我们进行快速查找,减少遍历次数,提高查找效率
    mongo中如何创建索引
    ensureIndex()
    功能 : 创建索引
    参数 : 索引类别,索引选项
    e.g.
    db.class0.ensureIndex({‘name’:1})
  • 1表示为该域创建正向索引,-1 表示逆向索引
  • _id 域会自动创建索引
    查看一个集合中的索引
    db.class0.getIndexes()
    删除索引
    dropIndex()
    功能 : 删除索引
    参数 : 删除索引的名称
    e.g. 可以通过索引名称或者索引键值对删除
    db.class0.dropIndex(‘name_1’)
    db.class0.dropIndex({name:1})
    dropIndexes()
    功能 : 删除所有索引
    e.g. db.class0.dropIndexes()
    索引类型
    复合索引
    根据多个域创建一个索引
    db.class0.ensureIndex({name:1,age:-1})
    数组索引
    如果对某个数组域创建索引,那么表示对数组中的每个值均创建了索引,通过数组中单个值查询,也是索引查询
    db.class1.ensureIndex({‘score’:1})
    子文档索引
    如果对一个域创建索引,值是一个文档则子文档也会同时形成索引
    如果对子文档某一个域进行索引创建,则只有通过子文档中的该域查找时为索引查找
    e.g.
    db.class2.ensureIndex({‘publication.pulisher’:1})
    覆盖索引
    查找时只获取索引项的内容,而不必去获取原数据中的其他内容,这样就不去连接原来的数据直接返回即可
    e.g. name为索引项,显示也只要name域
    db.class0.find({name:‘Lily’},{_id:0,name:1})
    唯一索引
    创建索引时希望索引域的值均不相同,也可以据此限制一个域的值
    e.g.
    db.class0.ensureIndex({name:1},{‘unique’:true})
    *当对某个域创建了唯一索引后,即不允许在插入相同的值的文档
    稀疏索引(间隙索引)
    只针对有指定域的文档创建索引表,没有该域的文档,不会插入到索引表中
    e.g.
    db.class2.ensureIndex({‘date’:1},{sparse:true})
    索引约束 :
    1.影响数据的插入,删除,修改操作。当数据发生改变时,索引表必须同步更新
    2.索引也是需要占用一定的空间资源
    综上 : 当数据库大量的操作是插入,修改,删除操作,而非查询操作时,不适合创建索引。数据量比较小时,考虑到空间成本也不适合创建索引。即使适合创建索引的情况,也不是索引越多越好。
    聚合
    多数据文档进行整理统计
    db.collectionName.aggregate()
    功能 : 聚合函数,配合聚合条件进行数据整理统计
    参数 : 聚合条件
    聚合操作符
    $group 分组 和分组操作符配合使用确定按什么分组
    ++++++++++++++++++++++++++++++++++
    分组操作符 (和$group配合)
    $sum 求和
    统计每组个数
    db.class0.aggregate({$group:{_id:’$gender’,num:{$sum:1}}})
    聚合 分组 按gender分组 统计结果名
    统计每组年龄和
    db.class0.aggregate({$group:{_id:’$gender’,num:{$sum:’$age’}}})
    $avg 求平均数
    求平均年龄
    db.class0.aggregate({$group:{_id:’$gender’,num:{$avg:’$age’}}})
    $min 求最小值
    求每组姓名的最小值
    db.class0.aggregate({$group:{_id:’$gender’,name:{$min:’$name’}}})
    $max
    求每组姓名的最大值
    db.class0.aggregate({$group:{_id:’$gender’,name:{$max:’$name’}}})
    $first
    返回每组第一个文档指定域值
    db.class0.aggregate({$group:{_id:’$gender’,name:{$first:’$name’}}})
    $last
    返回每组最后一个文档指定域值
    db.class0.aggregate({$group:{_id:’$gender’,name:{$last:’$name’}}})
    +++++++++++++++++++++++++++++++++++
    $project
    用于修饰文档的显示结构
    e.g.
    db.class0.aggregate({$project:{_id:0,name:1,age:1}})
    e.g.
    db.class0.aggregate({$project:{_id:0,Name:’$name’,Age:’$age’}})
    $match 过滤数据
    操作符的值同find的query
    db.class0.aggregate({$match:{name:{$gt:‘Tom’}}})
    $skip 跳过前几条文档
    db.class0.aggregate({$skip:2})
    $limit 显示几条文档
    db.class0.aggregate({$limit:2})
    $sort 排序
    db.class0.aggregate({$sort:{name:1}})
    聚合管道
    将前一个聚合操作的结果给下一个聚合操作继续执行
    db.collectionName.aggregate([聚合1,聚合2,…])
    e.g. match—> project —> sort
    db.class0.aggregate([{$match:{name:{$gt:‘Tom’}}},{$project:{_id:0,name:1,age:1}},{$sort:{name:-1}}])
    e.g. group —> match
    db.class0.aggregate([{$group:{_id:’$gender’,num:{$sum:1}}},{$match:{$nor:[{_id:‘m’},{_id:‘w’}]}}])
    作业练习 :
    使用之前的grade数据库
    增加分数域 score:{‘chinese’:88,‘english’:78,‘math’:98}
  1. 按照性别分组统计每组人数
    aggregate({$group:{_id:’$sex’,num:{$sum:1}}})
  2. 按照姓名分组,过滤出有重名的同学
    aggregate([{$group:{_id:’$name’,num:{$sum:1}}},{$match:{num:{$gt:1}}}])
  3. 统计每名男生的语文成绩
    aggregate([{$match:{sex:‘m’}},{$project:{_id:0,name:1,‘score.chinese’:1}}])
  4. 将女生按照英语分数降序排列
    aggregate([{$match:{sex:‘w’}},{$sort:{‘score.english’:-1}}])
    ========================================================
    修改
    update(query,update,upsert,multi)
    修改器 : $set $unset $rename $setOnInsert $inc $mul
    $min $max
             $push $pushAll $each $pull $pullAll $position
             $pop $addToSet $sort
    数据类型 Date() ISODate() valueOf()
    null 的使用
    Object :通过 . 取内部文档
    通过 . 取数组索引
    索引创建 ensureIndex()
    聚合操作 aggregate()
    聚合操作符 $group $match $project $limit $skip $sort
    ========================================================
    固定集合
    mongo中可以创建大小固定的集合,称之为固定集合,固定集合的性能出色,适用于很多场景
    比如 : 日志处理, 临时缓存
    特点 : 插入速度快
    顺序查询速度快
             能够淘汰早期数据
             可以控制集合空间
    创建:
    db.createCollection(collectionName,{capped:true,size:10000,max:1000})
    size :设置固定集合的大小 kb
    max : 最多能容纳多少文档
    e.g.
    创建一个最多包含三条文档的集合
    db.createCollection(‘log’,{capped:true,size:10,max:3})
    文件存储
    数据库存储文件的方式
  5. 在数据库中以字符串的方式存储文件在本地的路径
    优点 : 节省数据库空间
    缺点 : 当数据库或者文件位置发生变化即需要相应修改数据库内容
  6. 将文件已二进制数据的方式存放在数据库里
    优点:文件存入数据库,数据库在,文件即不会丢失
    缺点: 当文件较大时,数据库空间占用大,提取困难
    mongo中 使用GridFS方法 大文件存储
    GridFS : 是mongodb中大文件存储的一种方案,mongo中认为大于 16M的文件为大文件
    方案解释:
    在mongodb数据库中 创建两个集合 共同完成对文件的存储
    fs.files : 存储文件的相关信息,比如:文件名 文件类型
    fs.chunks : 实际存储文件内容,以二进制方式分块存储。将大文件分为多个小块,每块占一个空间
    mongofiles -d dbname put file
    数据库 要存储的文件
    *如果数据库不存在则自动创建
    fs.files
    { “_id” : ObjectId(“5b0770c169d72e1e3a6eebda”), “chunkSize” : 261120, “uploadDate” : ISODate(“2018-05-25T02:11:13.986Z”), “length” : 8313457, “md5” : “4b39deb86dcb6ece44ef52a69dcd6e1a”, “filename” : “xly.zip” }
    fs.chunks
    { “_id” : ObjectId(“5b0770c169d72e1e3a6eebee”), “files_id” : ObjectId(“5b0770c169d72e1e3a6eebda”), “n” : 19, “data” : BinData(0,"wGTrj3…)}
    获取数据库中文件
    mongofiles -d grid get xly.zip
    优缺点 :
    优点 : 存储方便,方便数据库移植,对文件个数没有太多限制
    缺点 : 读写效率低
    游标
    为什么使用游标
  7. 防止网络拥塞,造成数据传输慢
  8. 提高用户解析体验,可以后端解析
    var cursor = db.class0.find() 创建游标
    cursor.hasNext() 查看是否有下一个数据
    cursor.next() 获取下一个数据
    通过Python 操作mongodb数据库
    Python —》 mongodb编程接口 pymongo
    安装
    sudo pip3 install pymongo
    操作步骤
  9. 创建mongo数据库的链接对象
    conn = MongoClient(‘localhost’,27017)
  10. 生成数据库对象
    db = conn.stu
  11. 生成集合对象
    my_set = db.class0
  12. 增删改差索引聚合操作
    插入数据 insert() insert_many() insert_one()
    save()
    删除数据
    remove({},multi = True)
    multi 默认为True 表示删除所有符合条件的数据
    设置为False 表示只删除一条
    数据查找
    find()
    功能 : 查找数据库内容
    参数 : 同 mongo shell find()
    返回值 : 返回一个游标 —》 迭代器
    cursor 可迭代对象属性函数
    next()
    count()
    limit()
    skip()
    sort()
    mongoshell —> sort({‘name’:1})
    pymongo —> sort([(‘name’,1)])
  • 进行排序时游标要确保没有被访问过
    find_one()
    返回值是一个字典
    修改操作
    update()
    参数和mongoshell 中 update相同
    update_many() :匹配到多个文档时全部修改
    update_one() : 只修改匹配到的第一条文档
  • 变成中mongo的数据类型null 可以用Python中的 None替代
    索引
    创建索引
    ensure_index()
    create_index()
    create_indexes() 创建多个索引
    查看集合中的索引
    list_indexes()
    删除索引
    drop_index() 删除某一个索引
    drop_indexes() 删除所有索引
    聚合操作
    aggregate([])
    参数 : 与mongoshell中聚合参数写法一致
    返回值 : 迭代器 同find的返回值

python操作mongo范例

'''
    Author: Ribbon Huang
    Date: 2018-07-26
'''
import logging
from pymongo import MongoClient
from .settings import MONGO_HOST, MONGO_PORT, MONGO_DB, MONGO_SHEET


# 记录日常日志
logger = logging.getLogger('mongoError')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
fileHandler = logging.FileHandler('mongoError.log')
fileHandler.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(fileHandler)


class MongoUse:
    def __init__(self, host = MONGO_HOST, port = MONGO_PORT, db = MONGO_DB, sheet = MONGO_SHEET):
        # try:
        self.client = MongoClient(host, port)
        # except:
        #     logger.warning('MongoDB can not start')
        #     print(6666)
        db = self.client[db]
        sheet = db[sheet]
        sheet.insert({'1':1})
        # self.db = self.client[db]
        # self.sheet = self.db[sheet]

    def db_operat(self, sql):
        self.close()

    def close(self):
        self.client.close()

if __name__ == '__main__':
    MongoUse()

logger.removeHandler(fileHandler)

如果觉得这篇文章对你有用,麻烦点赞并关注噢

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值