芒果数据库基本操作 您所在的位置:网站首页 芒果云平台 芒果数据库基本操作

芒果数据库基本操作

2023-09-21 09:44| 来源: 网络整理| 查看: 265

芒果数据库基本操作 MongoDB (芒果数据库)

数据存储阶段

文件管理阶段(.txt  .doc  .xls)

优点 : 使用简单方便         数据能够长期保存           可以存储大量数据

缺点 : 数据一致性差         数据的查找修改不方便           数据冗余

数据库管理阶段

优点 : 数据组织结构化,降低冗余         提高增删改查效率           方便扩展           方便程序调用,做自动化的处理 缺点 : 数据库使用特定的语句操作,相对复杂

几个概念

数据 :能够输入到计算机中并被识别处理的信息的集合

数据结构:研究一个数据集合中,数据之间关系的学科

数据库: 按照数据结构,存储数据的仓库。在数据库管理系统管理下在一定介质上的数据集合。

数据库管理系统 :管理数据库的软件,用于建立维护数据库

数据库系统 :由数据库和数据库管理系统等开发工具组成的集合

关系型数据库

采用关系模型来组织数据结构的数据库 (二维表)

Oracle  DB2   SQLServer  MySql   Sqlite

优点:容易理解,逻辑类似常见的表格       使用方便,都使用sql语句,sql语句很成熟       数据一致性高,冗余低,完整性好       技术成熟,可以使用外部关联等复杂操作

缺点:每次都需要sql语句的解析,消耗大       不能很好的满足并发需求,特别是海量数据爆发,读写能力不足       关系型数据库每一步操作都要加锁,以保证操作的原子性,增加了数据库负担       数据的一致性有时会导致空间浪费

非关系型数据库 (NoSql--》not only sql)

优点 : 高并发,读写能力强         普遍比关系型数据库容易扩展           弱化了数据结构,降低数据一致性

缺点 : 通用性差,没有sql语句一样的一致化操作         操作过于冗长,容易混乱           没有join等复杂操作,很多也不支持事务等操作

NoSql 使用情况 1. 对数据一致性要求低 2. 数据库需要处理海量并发 3. 需要处理速度较快,比如做一个临时的中间过度存储    器 4. 数据库构建比较方便的构建非关系模型

Nosql分类:

键值型数据库:Redis 列存储数据库 文档型数据库:MongoDB 图形数据库

MongoDB 数据库  (非关系型数据库--》文档型数据库)

1. 由c++编写的数据库管理系统 2. 支持丰富的增删改查操作 3. 支持丰富的数据类型 4. 支持众多的编程语言接口(python  PHP  C++  c#) 5. 使用方便,便于部署。相对成熟。

MongoDB安装

自动安装 sudo apt-get install mongodb

默认安装位置 :  /var/lib/mongodb  配置文件:/etc/mongodb.conf 命令集: /usr/bin   /usr/local/bin (软件安装后提供功能性的命令)

手动安装 1.下载Mongodb(开源) www.mongodb.com-->get mongodb --> community server

选择想要下载的版本

2. 选择合适的位置解压(/usr/local  /opt) tar 解压后得到 MongoDB文件夹

3. 将命令集 (解压后文件夹中bin目录)添加到环境变    量 PATH=$PATH:/opt/mongo/bin export PATH 将以上两句添加如 /etc/rc.local

4. 重启系统

Mongodb 命令

设置数据库存储位置 mongod  --dbpath   目录

e.g.    mongod  --dbpath  dbs

设置数据库端口 mongod  --port  8080  *默认端口  27017

mongo  进入mongo shell界面:mongodb的交互界面,操作数据库

退出界面 : quit() 或  ctrl + c 

mongodb数据库组织形式

键值对 ---》 文档 ---》 集合 ---》数据库

------------------------ ID   |   NAME   |   AGE ------------------------ 1    |   Lily   |   17 ------------------------ 2    |   Lucy   |   18 ------------------------

{   "_id":1,   "NAME":"Lily",   "AGE":17 }, {   "_id":2,   "NAME":"Lucy",   "AGE":18 }

mysql 和 mongodb 概念比价

mysql        mongodb        含义

database     database       数据库

table        collection     表/集合

column       field          字段/域

row          document       记录/文档

index        index          索引

创建数据库

use databaseName 

e.g.  use stu  #创建一个stu数据库

* use 实际上是表示选择某个数据库使用。当这个数据库不存在时会自动创建。 * 使用use后数据不会马上被创建,而是在实际写入数据时才会创建

查看当前系统中数据库 show  dbs

系统数据库: admin:存放用户及其权限 local: 存储本地数据 config:存储分片信息

数据库的命名规则 1. 使用utf-8字符 2. 不能有空格,点,/ \  '\0'字符 3. 长度不超过64字节 4. 不和系统数据库重名

db:mongodb系统全局变量,代表当前正在使用的数据库

* 如果没有use任何数据库情况下 db表示test。此时插入数据则创建test数据库

数据库备份和恢复

备份:mongodump -h dbhost -d    dbname   -o dbdir                    主机      要备份数据库   目录

e.g.    将stu数据库备份到student目录中 mongodump -h  127.0.0.1 -d stu -o student

恢复:mongorestore -h  dbhost:port -d dbname  path                        主机           数据库  目录

e.g. 将stu数据库恢复到student数据库中 mongorestore -h 127.0.0.1:27017 -d student  student/stu

数据库的监测 mongostat

insert query update delete: 每秒执行增删改查次数 command : 每秒运行命令次数 flushes : 每秒清理缓存次数 vsize :使用的虚拟内存 res:物理内存

mongotop  监测每个数据库的读写时长

 ns         total     read       write 数据集合    总时长    读时长    写时长

删除数据库 db.dropDatabase()

删除db代表的数据库

创建集合 

db.createCollection(collection_name)

e.g.    创建一个class1的集合 db.createCollection("class1")

创建集合2 当向一个集合中插入数据的时候,如果这个集合不存在则会自动创建

db.collecionName.insert(...)

e.g.  如果class2不存在则自动创建    db.class2.insert({"name":'Tom','age':17,'sex':'m'})

查看数据库中集合 show collections show tables

集合命名规则 1. utf-8 字符 2. 不能有'\0' 3. 不要以system.开头,因为这是系统保留集合前缀 4. 不要和关键字重复

删除集合 db.collectionName.drop() 

e.g.   db.class.drop()   #删除class这个集合

集合的重命名

db.collectionName.renameCollection("new_name")

e.g.  将class2重命名为class0 db.class2.renameCollection("class0")

文档

mongodb中数据的组织形式 --》 文档

mongodb文档 :以键值对形式组成的类似字典的数据描述形式

键: 即文档的域

键的命名规则: 1. utf-8字符串 2. 不含有'\0' 通常不用 .  $ 3. 一个文档中的键不能重复

* 文档中的键值对是有序的 * mongodb中数据严格区分大小写

值: 即文档存储的数据    支持bson数据

JavaScript ---》 json ---》bson

类型             值

整型            整数 布尔类型        true  false 浮点型          小数 Array           数组 Timestamp       时间戳 Date            时间日期 Object          内部文档 Null            空值 null String          字符串 Symbol          特殊字符串 Binary data     二进制字串 code            代码 regex           正则表达式 ObjectId        ObjectId字串

ObjectId 

"_id" : ObjectId("5b503b7f38d0e992e1270560")

_id : 当在mongo代表中插入文档时,如果不指定_id则会自动添加这个域,作为主键。

ObjectId() 值是系统自动生成的不重复字串标识

24位   8位  文档创建时间        6位  机器ID        4位  进程ID        6位  计数器

集合中的文档: 1. 集合中的文档不一定有相同的域 2. 集合中的文档多少不一定相同 3. 集合中的文档,值的类型不一定相同

集合设计 1. 集合中的文档尽可能描述同一类数据 2. 同一类数据不要过多分散在多个集合中存放 3. 集合中文档的结构层次不宜过多

插入文档

db.collectionName.insert()

插入单个文档

e.g. db.class0.insert({name:"HanMei",age:17,sex:'w'})

* 插入数据时域名可以不加引号 * 查看插入结果  db.class.find() * _id 为系统自动添加主键,如果自己写_id则为自己设定的值,但是仍然不可重复 * 一个集合中的文档是有序的

插入多个文档 db.collectionName.insert([{},{},{}])

e.g.  db.class2.insert([{name:'阿宝',age:32},{name:'阿哲',age:31},{name:'阿蓉',age:26}])

save() 插入文档 save() 也可以用来插入多条数据 如果正常插入与insert相同 当插入指定_id值重复的数据时save()可以对原数据进行修改,但是insert()会报错

db.collectionName.save()

e.g.   db.class1.save({name:'Lily',age:13,sex:'w'})

* 如果不加_id域时用法同insert() * 如果加_id,此_id值存在则save表示修改该文档。

作业 : 1. 关系型数据库和非关系型数据库区别 2. 复习mysql 增删改查 3. 练习mongo 数据库集合创建删除,文档插入命令

第二天

复习

1.关系型数据库和非关系型数据库比较 2.MongoDB 文档型数据库         创建数据库: use database     删除数据库: db.dropDatabase()

    创建集合: db.createCollection()                db.collection.insert()     删除集合: db.collection.drop()     重命名  : db.collection.renameCollection()          查看数据库: show  dbs     查看集合: show collections                    show  tables

3. 文档   bson

www.mongodb.com --> docs  查找文档帮助

插入文档 : insert()   save()  ***********************************************

获取集合对象  db.getCollection('class1') ===》 db.class1      e.g.  db.getCollection('class1').insert({name:'Marry',age:16,sex:'w'})

查找操作

mysql :  select ... from  table  where ....

mongo :  db.collection.find(query,field)

查找所有内容 db.collection.find()  ----> select * from table

find(query,field) 功能 : 查找数据 参数 : query: 筛选条件,相当于where子句         field: 选定要展示的域 返回值 : 返回查找到的文档

query : 以键值对形式给出筛选条件         {name:'Lily'} e.g.  db.class1.find({name:'Lily'})

field : 以键值对的形式给出要展示(不展示)的域,域名为键,值为1表示展示,0表示不展示

* 如果某个域设置为0则表示不展示该域其他的均展示 * 如果某个域设置为1则表示展示该域其他的均不展示 * _id必须设置为0才不会显示 * 除了_id其余设置的值必须相同

e.g.  db.class1.find({name:'Lily'},{_id:0,name:1,age:1})

findOne(query,field) 功能 : 只查找第一条复合条件的文档 参数返回值同find()

e.g.  db.class1.findOne({sex:'w'},{_id:0})

query 更多筛选功能

操作符:使用$符号标注的一个有特殊意义的字符串。用以表达一定的含义。比如 $lt 表示小于

比较操作符 $eq  等于

e.g.    db.class1.find({age:{$eq:13}},{_id:0})         db.class1.find({age:13},{_id:0})

$lt  小于

=

e.g  大于等于15    db.class1.find({age:{$gte:15}},{_id:0})

$ne   不等于  !=

e.g.  不等于13  db.class1.find({age:{$ne:13}},{_id:0})

* 如果某个文档不存在查找的域,则不等于可以匹配到该文档

$in  包含

e.g.  年龄包含 在11,12,13,14的 db.class1.find({age:{$in:[11,12,13,14]}},{_id:0})

$nin  不包含

e.g. 年龄不是13,14 db.class1.find({age:{$nin:[13,14]}},{_id:0})

逻辑操作符

query 逗号分隔的条件即为与关系 e.g. 年龄大于13 小于16 > db.class1.find({age:{$gt:13,$lt:16}},{_id:0}) e.g. 年龄大于13且性别为女 > db.class1.find({age:{$gt:13},sex:'w'},{_id:0})

$and 逻辑与

e.g.   年龄大于13 并且姓名大于Lily db.class1.find({$and:[{age:{$gt:13}},{name:{$lt:'Lily'}}]},{_id:0})

$or 逻辑或

e.g.  年龄大于15或者为男生 db.class1.find({$or:[{age:{$gt:15}},{sex:'m'}]},{_id:0})

$not  逻辑非

e.g.  年龄不大于15 db.class1.find({age:{$not:{$gt:15}}},{_id:0})

$nor  既不也不

e.g.  既不大于16 也不是女生 db.class1.find({$nor:[{age:{$gt:16}},{sex:'w'}]},{_id:0})

条件混合

年龄大于16并且为男生  或者 年龄小于14  db.class1.find({$or:[{age:{$gt:16},sex:'m'},{age:{$lt:14}}]},{_id:0})

年龄大于16或者为女生  并且 姓名大于 Jame db.class1.find({name:{$gt:'Jame'},$or:[{age:{$gt:16}},{sex:'w'}]},{_id:0})

数组  

[1,2,3,4]

数组查找

查看数据中是否包含某一项

e.g.  如果score数组中包含67即可 db.class3.find({score:67},{_id:0}) db.class3.find({score:{$gt:90}},{_id:0})

$all 查找数据中同时包含多项

e.g. 同时包含64  75 db.class3.find({score:{$all:[64,75]}},{_id:0})

$size  通过数组元素个数查找

e.g.  db.class3.find({score:{$size:3}},{_id:0})

$slice  取出数组的部分进行显示  放在field中

e.g.  显示数组中前两项 db.class3.find({},{_id:0,score:{$slice:2}})

e.g.  跳过第一项显示后面一项 db.class3.find({},{_id:0,score:{$slice:[1,1]}})

其他查找方法

$exists 判断一个域是否存在

e.g.  查找存在age域的文档 db.class1.find({age:{$exists:true}},{_id:0} )

* true 表示有这个域 false表示筛选无这个域

$mod 余数查找

e.g.  查找除以2余数为1的   db.class1.find({age:{$mod:[2,1]}},{_id:0} )

$type  找出值为指定类型的文档

e.g.  查找age数据类型为1的文档  db.class1.find({age:{$type:1}},{_id:0} )

具体数字和类型的匹配 Type                Number Double                 1 String                 2 Object                 3 Array                   4 Binary data             5 ObjectId               7 Boolean                 8 Date                   9 Null                   10 RE                     11 Symbol                 14 32-bit integer         16 Timestamp               17 64-bit integer         18

查找结果相关函数

distinct() 功能:查看集合某个域的取值范围

e.g. 查看集合中age域值的范围   db.class1.distinct("age")

pretty() 功能: 格式化显示查找结果

e.g.   db.class1.find().pretty()  

limit(n) 功能: 显示查找结果的前n条

e.g.  显示查找结果的前三条   db.class1.find({},{_id:0}).limit(3)

skip(n) 功能 : 跳过前n条显示

e.g.  跳过前三条显示后边的内容 db.class1.find({},{_id:0}).skip(3)

count() 功能 : 计数统计

e.g. 统计男生数量 db.class1.find({sex:'m'},{_id:0}).count()

sort({域:1/-1}) 功能 : 对查找结果排序 参数 : 以键值对的形式给出         1 表示按照升序排序, -1表示降序排序

e.g.  按照年龄升序 db.class1.find({},{_id:0}).sort({age:1})

复合排序:当第一排序项相同时比较第二排序项

e.g.  db.class0.find({},{_id:0}).sort({age:1,name:1})

函数的连续调用 当函数返回文档集合时还可以继续调用函数

e.g.  查找班级年龄最大的三个 db.class1.find({},{_id:0}).sort({age:-1}).limit(3)

文档的删除操作

delete  from table  where  ...

db.collection.remove(query,justOne) 功能 : 删除文档 参数 : query  筛选要删除的文档 相当于where                用法同查找     justOne : 布尔值,默认为false 表示删除所有。如果设置为true 只删除第一条符合条件的文档。 e.g.  db.class2.remove({name:"阿蓉"})

e.g.  justOne为true则只删除第一条符合条件的 db.class0.remove({age:17},true)

删除集合中所有文档

e.g.  删除class2中所有文档 db.class2.remove({})

练习 : 1. 创建数据库  名字 grade   use  grade 2. 数据库中创建集合 class 3. 集合中插入文档,格式如下    {name:'zhang',age:10,sex:'m',hobby:['a','b']}    age范围  4-15    hobby 范围     [draw  dance  sing  pingpong    basketball  football  running  computer]  

4. 查找练习    查看班级所有人信息    db.class.find({},{_id:0})

   查看班级年龄8岁的同学信息    db.class.find({age:8},{_id:0})        查看年龄大于10岁的学生信息    db.class.find({age:{$gt:10}},{_id:0})       查看年龄在8-11岁之间的学生信息    db.class.find({$and:[{age:{$gt:8}},{age:{$lt:11}}]},{_id:0})

   查看年龄为9岁且为男生的学生    db.class.find({age:9,sex:'m'},{_id:0})

   找到年龄小于7岁或大于12岁的学生    db.class.find({$or:[{age:{$lt:7}},age:{$gt:12}],{_id:0})      找到年龄为8岁或者11岁的学生    db.class.find({$or:[{age:8},{age:11}]},{_id:0})    db.class.find({age:{$in:[8,11]}})

   找到有两项兴趣爱好的学生    db.class.find({hebby:{$size:2}},{_id:0})

   找到兴趣中有draw的学生    db.class.find({hebby:draw},{_id:0})

   找喜欢画画又喜欢跳舞的学生    db.class.find({hebby:{$all:['draw','dance']}})

   统计兴趣有三项的学生人数    db.class.find({hebby:{%size:3}}).count

   找到本班年龄第二大的同学     db.class.sort({age:-1}).skip(1).limit(1)

   查看本班学生兴趣爱好涵盖哪些方面    db.class.distinct('hebby')

   找到年龄最大的三个同学    db.class.sort({age:-1}).limit(3)

5. 删除所有年龄大于12或者小于7岁的同学除非他的爱好有三项以上   db.class.remove({$and:[{$or:[{age:{$gt:12}},{age:{$lt:7}}]},{hebby:{$size:{$lt:3}}}]})

 

修改操作 update  table  set  ... where ...

db.collection.update(query,update,upsert,multi) 功能 : 修改文档 参数 : query : 筛选需要修改的文档,相当where                  用法同查找         update: 要修改什么内容 相当set。往往需要配合修改操作符           upsert:bool值 默认false 如果query的文档不存在则不做操作                 设置为true 则如果文档不存在根据query和update内容插入新文档           multi: bool值 默认false 如果筛选到多条文档则只修改第一条。                 设置为true则表示修改所有筛选到的文档

e.g.  年龄修改为18 db.class0.update({name:'HanMei'},{$set:{age:18}})

e.g.  如果筛选内容不存在则插入   db.class0.update({name:'Jame'},{$set:{age:18}},true)

e.g.  如果匹配到多条,则修改所有 db.class0.update({sex:'w'},{$set:{name:'小芳'}},false,true)

作业 : 1. 操作一遍增删改查已经解除的操作符         2. 学习一下魔法方法 __call__            3. 网络程序

第三天

复习 : 

1. 查找操作   find(query,field)   findOne()

   操作符 : 比较  $lt  $lte  $gt  $gte  $ne  $eq                    $in  $nin                逻辑 $and  $or   $not  $nor

             数组  $all  $size 

               其他  $exists   $mod   $type

2. 函数 : pretty()  limit()   skip()  sort()            count()    其他函数: distinct()   getCollection()

3.  删除文档    remove(query,justOne)                 remove({})

4.  修改操作  update(query,update,upsert,multi)

==================================================

修改操作符

$set 修改一个域的值,或者增加一个域

e.g.  修改功能 如果该域不存在则增加这个域 db.class0.update({age:20},{$set:{name:'小薇'}})

$unset 删除一个域

e.g.   sex后面为空表示删除一个域 db.class0.update({name:'Jame'},{$unset:{sex:''}})

$rename  修改一个域的名称

e.g.  将sex域名修改为gender db.class0.update({},{$rename:{sex:'gender'}},false,true)

$setOnInsert 如果update执行了插入文档操作,表示补充插入内容 

e.g.  如果执行插入操作则将setOnInsert中内容也插入 db.class0.update({name:'Tom'},{$set:{age:17},$setOnInsert:{gender:'m',tel:'12345'}},true) 00 * 在update参数中可以同时写多个修改器

$inc 加减修改器

e.g. 所有人年龄增加1 db.class0.update({},{$inc:{age:1}},false,true)

* $inc值可以是正数负数整数小数

$mul 乘法修改器

e.g. Tom年龄 乘以2 db.class0.update({name:'Tom'},{$mul:{age:2}})

* $mul值可以是正数负数整数小数

$max 指定了某个域值的下限,如果小于指定值则修改为指定值

e.g.  将年龄不到20的修改为20 db.class0.update({},{$max:{age:20}},false,true)

$min 指定了某个域值的上限,如果大于指定值则修改为指定值

e.g.  年龄大于25的修改为25  db.class0.update({},{$min:{age:25}},false,true)

数组修改器

$push  向数组中添加一项

e.g.  db.class3.update({name:'小明'},{$push:{score:5}})

$pushAll  向数组中添加多项

e.g. db.class3.update({name:'小红'},{$pushAll:{score:[5,10]}})

$pull  从数组中删除一项

e.g. db.class3.update({name:'小红'},{$pull:{score:10}})

*数组可以有重复值,如果删除则会把所有指定的值都删除

$pullAll  删除数组中多项

e.g.   db.class3.update({name:'小明'},{$pullAll:{score:[67,5]}})

$each   对多个值逐一操作

e.g.   db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}})

$position  指定插入位置 

e.g.  需要搭配$each使用,将数据从1号位置插入 db.class3.update({name:'小红'},{$push:{score:{$each:[10],$position:1}}})

$sort  对数组进行排序

e.g.  和each一起使用,对数组score进行排序 db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:1}}})

$pop  弹出一项

e.g.   1表示弹出最后一项 -1表示删除第一项   db.class3.update({name:'小红'},{$pop:{score:-1}})

$addToSet  向数组中添加一项,不能和已有的内容重复

e.g.  添加87,不能和已有数据重复 db.class3.update({name:'小红'},{$addToSet:{score:87}})

时间类型

mongodb中存储时间格式 : ISODate()

方法1 :  new Date()   自动生成当前时间

e.g.  db.class2.insert({title:'Python入门',date:new Date()})

方法2 : ISODate()  生成当前时间

e.g.  db.class2.insert({title:'Python精通',date:ISODate()})

方法3  Date()  将生成的当前时间变为字符串存储

e.g.  db.class2.insert({title:'Python疯狂',date:Date()})

ISODate() 功能 : 生成时间类型存储 参数 : 参数指定时间          "2018-07-01 12:10:56"      "20180701 12:10:56"      "20180701"

e.g.  db.class2.insert({title:'Python崩溃',date:ISODate("2018-07-01 01:12:12")})

时间戳

valueOf() 将时间转换为时间戳

e.g. db.class2.insert({title:'Python放生',date:ISODate().valueOf()})

Null  ----》 null

1. 如果某个域存在却没有值,可以设置为null

e.g.   db.class2.insert({title:'Python涅槃',price:null})

2. 如果某个域不存在可以使用null匹配

e.g.  找到date域不存在的文档  db.class2.find({date:null},{_id:0})

Object 内部文档

文档内某个域的值还是一个文档,则这个文档为内部文档

* 当需要使用内部文档某个域的时候,可以使用外部文档 . 的方法引用内部文档。但是注意此时需要加引号

e.g. db.class4.find({'book2.title':'python Web'},{_id:0})

e.g.  db.class4.update({'book1.title':'python爬虫'},{$set:{'book1.price':48.8}})

数组的下标引用

* 使用数组时,可以使用数组域 . 数组序列下标的方式引用数组的具体某一项

e.g.  db.class3.find({'score.0':98},{_id:0})

e.g. db.class3.update({name:'小明'},{$set:{'score.0':100}})

查找结果的有序性

即可以对find的查找结果使用[]的方式引用具体某一条

e.g. db.class1.find({},{_id:0})[1]

练习 :  使用之前的grade数据库

1. 将小红年龄修改为8岁,兴趣爱好变为跳舞画画 {$set:{age:8,hobby:[‘draw’,'dance']}}

2. 追加小明兴趣爱好 唱歌  {$push:{hobby:'sing'}}

3. 追加小王兴趣爱好,吹牛,打篮球 {$pushAll:{hobby:['chuiniu','basketball']}}

4. 小李兴趣多了跑步唱歌,但是要确保和之前的不重复 {$addToSet:{hobby:{$each:['running','sing']}}}

5. 班级所有人年龄加1 {$inc:{age:1}},false,true

6. 删除小明的sex属性 {$unset:{sex:''}}

7. 删除小李的第一个爱好  {$pop:{hobby:-1}}

8. 删除小红的兴趣画画和唱歌 {$pullAll:{hobby:['draw','sing']}}

索引

指建立指定键值对及所在文档中存储位置的对照清单。使用索引可以方便我们快速查找,减少遍历次数,提高查找效率。

mongodb创建索引

ensureIndex() 功能 : 创建索引 参数 : 索引域,索引类别和选项

e.g.  根据name 创建索引 db.class1.ensureIndex({name:1})

* 1表示正序 -1逆序

查看一个集合中的索引

db.class1.getIndexes()

* _id是系统自动创建的索引

自定义索引名称

db.class1.ensureIndex({name:1},{name:'name_index'})

删除索引 dropIndex() 功能 : 删除索引 参数 : 要删除的索引,可以是索引名称或者索引键值对

e.g.   db.class1.dropIndex('age_index') e.g.   db.class1.dropIndex({name:-1})

dropIndexes() 删除所有索引  除了_id

e.g. db.class1.dropIndexes()

索引类型

复合索引 根据多个域创建一个索引

e.g.  db.class1.ensureIndex({name:1,age:-1})

数组和子文档索引

如果对某个域创建索引,值为数组或者子文档,则通过数组或子文档进行查找时也是索引查找

覆盖索引

查找返回的内容,仅仅是索引表存储的内容,不需要再去原数据库查找

唯一索引

创建索引时希望集合中创建索引的域的值均不重复

e.g. db.class1.ensureIndex({name:1},{unique:true})

* 创建唯一索引的域的值不可以重复

稀疏索引(间隙索引)

只针对有指定域的文档创建索引表,如果某个文档没有该域则不做索引处理

e.g.  创建age域的稀疏索引 db.class1.ensureIndex({age:1},{sparse:true})

索引约束 1. 当数据发生更新 ,索引也要随之更新。影响插入,修改,删除操作的效率 2. 索引表也需要占有一定的磁盘空间

综上 :当数据量比较小,或者需要频繁的进行数据修改操作而不是查找操作的时候,不适合创建索引

聚合操作

对文档的更高级的筛选整理统计

db.collection.aggregate() 功能 : 聚合函数,完成聚合操作 参数 : 聚合条件 ---》 聚合操作符

聚合操作符

$group  分组聚合  需要配合分组统计操作符使用              $sum  : 求和               e.g.        db.class1.aggregate({$group:{_id:'$sex',                     分组  按sex内容分组        num:            {$sum:1}}})      自定义统计域       统计什么

       e.g. 统计所有男生和女生的年龄之和     db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})

     $avg   求平均            e.g.  求每个性别的平均年龄      db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})

     $max  求最大值            e.g.  求每组年龄的最大值      db.class1.aggregate({$group:{_id:'$sex',max:{$max:'$age'}}})

     $min  求最小值

     e.g.  求每组年龄的最小值      db.class1.aggregate({$group:{_id:'$sex',min:{$min:'$age'}}})

$project  用于修改文档的显示效果

e.g.  db.class1.aggregate({$project:{_id:0,sex:0}})

e.g.   指定显示域名 db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})

$match  过滤数据

e.g.  过滤年龄大于16的 db.class1.aggregate({$match:{age:{$gt:16}}})

作业 : 熟练mongodb增删改查操作         熟练 索引操作

     第四天

复习:

1. 数据的修改  update(query,update,upsert,multi)

修改器 : $set   $unset  $rename  $setOnInsert           $inc   $mul  $max  $min        $push  $pushAll  $pull  $pullAll        $each  $position   $sort  $addToSet       $pop

时间类型 : new Date()   ISODate()  Date()             valueOf()

null : 作为一个域的值,或者表示一个域不存在

内部文档 :通过 . 获取内部文档某个域的值

索引操作: ensureIndex({},{})            dropIndex()  dropIndexes()            getIndexes()

聚合操作

aggregate()

聚合操作 $group   $project   $match $sum $avg $max $min **********************************************

聚合操作

$limit  显示前几条文档

e.g.  获取数据的前两个文档 db.class1.aggregate({$limit:2})

$skip  跳过几条文档

e.g.  跳过前两条文档显示后面内容   db.class1.aggregate({$skip:2})

$sort  排序

e.g.  按年龄升序排序  db.class1.aggregate({$sort:{age:1}})

聚合管道 : 将前一个聚合操作得到的结果,给后一个聚合操作继续使用

db.collection.aggregate([聚合1,聚合2....])

e.g. $match ---> $project  ---> $sort db.class1.aggregate([{$match:{sex:'m'}},{$project:{_id:0}},{$sort:{age:1}}])

e.g.   $group  ---> $match db.class1.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])

练习: 增加分数域  score:{chinese:88,math:76,english:76}

1.学生按照性别分组,统计每组人数 aggregate({$group:{_id:'$sex',num:{$sum:1}}})

2. 统计每名男生的语文分数 aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])

3. 将所有女生按照英语成绩降序排序 aggregate([{$match:{sex:'w'}},{$sort:{'score.englisth':-1}}])

固定集合

mongodb中可以创建大小固定的集合,称之为固定集合

特点 : 插入速度快,顺序查找速度快         能够淘汰早期数据           可以控制集合大小

使用 : 临时缓存         日志处理

db.createCollection(collection,{capped:true,size:10000,max:1000})

capped:true    表示创建固定集合 size : 表示集合的大小  bytes    4.0最小 4096 max : 表示最多存放多少文档

e.g.  db.createCollection('log',{capped:true,size:10,max:3})

文件存储

文件存储到数据库方式

1. 存储路径    将文件在本地的路径以字符串形式存储到数据库

   优点 : 节省数据库空间    缺点 : 当数据库或者文件位置发生变化时文件丢失。

2. 存储文件本身    以二进制方式将文件存储到数据库        优点:数据库和文件绑定存在    缺点 : 占用空间大,结构化麻烦

mongodb存储二进制文件

* GridFS方法存储大文件  >16M为大文件 * 将文件转化为二进制,进行插入  Binary data

GridFS方案解释

1. 在mongodb中一个数据库创建两个集合共同完成对文件的存储 2. fs.files 用来存储文件的相关信息,为每一个文件创建一个文档,存储文件名、文件类型等信息 3. fs.chunks 用来分块存储文件的实际内容

如何存储 mongofiles  -d  dbname   put   file                 数据库       要存储的文件

* 如果数据库不存在自动创建

fs.files { "_id" : ObjectId("5b569b8969d72e103282f608"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-07-24T03:22:54.259Z"), "length" : 247759369, "md5" : "a94853f4f64b3e87bf98aea770855615", "filename" : "abc.mp4" }

fs.chunks { "_id" : ObjectId("5b569b8969d72e103282f61d"), "files_id" : ObjectId("5b569b8969d72e103282f608"), "n" : 20, "data" : BinData(0,"7Pa7M7M9nZt2bezsz272vbdm/7fhu672fwAAbZKbmR2S7Ndv/.....")}

* 对于同一个文件 fs.files中的_id值等于 fs.chunks中的files_id值

文件提取方法

mongofiles  -d  dbname  get  file

Grid的优缺点 优点 : 存储方便,提供较好的命令支持 缺点 : 读写效率低

游标

通过一定的操作获取返回结果的对象

var  cursor = db.class1.find() cursor.hasNext()  判断是否有next cursor.next()  获取下一条数据

python操作mongodb 

pymongo模块   第三方模块

安装  sudo  pip3  install  pymongo

操作步骤 1. 创建mongodb数据库连接对象

conn = pymongo.MongoClient('localhost',27017)

2. 得到数据库对象

db = conn.stu 

3. 获取集合对象

myset = db.class1

4. 增删改查,索引 ,聚合

调用各种myset的属性函数

5. 关闭数据库连接 conn.close()

插入操作

insert() insert_many()     insert_one() save()

查找操作

cursor = find() 返回一个结果游标

* 在pymongo中使用操作符的方法与mongo shell中相同,只需要转变为字符串格式加上引号即可

cursor 的属性函数

next() limit() skip() sort([('name',1),('age',-1)]) count()

* 使用了next或者for取游标后就不能使用limit sort操作了

find_one() 返回一个字典

更新操作

update(query,updata,upsert=False,multi=False) update_many() update_one()

删除操作 remove(query,multi = True)

multi默认为True表示删除所有筛选内容 如果设置为False则表示删除一条

复合功能函数 find_one_and_delete()

索引操作 ensure_index()   创建索引 list_indexes()   查看索引 drop_index()   删除索引 drop_indexes()  删除所有索引

聚合操作 aggregate([]) 参数写法和mongo shell中聚合相同 返回值 : 返回一个迭代游标 同find()

GridFS  程序提取

import gridfs 

gridfs.GridFS(db)

插入二进制格式数据

import bson.binary 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有