mongodb进阶

目录

MongoDB安装

增删改查

高级查询

数据的备份与恢复 

聚合命令

索引的建立 


 

MongoDB安装

Ubuntu安装

sudo apt-get install -y mongodb-org

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

其他安装

服务端启动

客户端启动

增删改查

关于database的基础命令

查看当前数据库:db

查看所有的数据库:show dbs/ show databases

切换数据库:use 数据库的名字

删除当前数据库:db.dropDatabase()

 mango中没有创建数据库,不需要提前创建,直接使用use命令

例如下面的test1,但是如果没有立刻向use1中添加数据,再接着show的时候也不会显示test1

 关于集合的基础命令

mongodb中的一个表就是一个集合

不手动创建集合:

向不存在的集合中第一次加入数据时,集合就会被创建出来

手动创建集合:

db.creatCollection(name,options)

db.creatCollection("stu")

db.creatCollection("sub",{capped:true,size:10})

参数capped默认值为false表示不设置上限

参数size:当capped为true,需要指定此参数,表示上限大小,当文档达到上限时,会把前面的数据覆盖。单位是字节

查看集合:show collections

删除集合:db.集合名字.drop()

mongodb中的数据类型 

objectID:文档ID

string:字符串,最常用,必须是有效的UTF-8

Boolean:存储一个布尔值,true或false

integer:整数,可以是32位或64位,取决于服务器

double:存储浮点值

arrays:数组或列表,多个值存储到一个键

object:用于嵌入式的文档,即一个值为一个文档

null:存储null值

timestamp:时间戳,表示从1970-1-1到现在的总秒数

date:存储当前日期或时间的Unix时间格式

注意点

创建日期语句如下:new Date('2010-01-01')

每个文档都有一个属性,为_id,保证每个文档的唯一性

可以自己去设置_id插入文档;如果没有提供,那么mongodb为每个文档提供可一个独特的id,类型为objectID

objectID是一个12字节的十六进制数:

前4个字节为当前时间戳‘

接下来3个字节的机器ID

接下来的2个字节中mongodb的服务进程id

最后3个字节是简单的增量值’

 插入

db.集合名字.insert(document)

db.stu.insert({name:'ac',gender:1})

db.stu.insert({_id:'20170101',name:'ac',gender:1})

插入文档时,如果不指定ID参数,mongDB会为文档分配一个唯一的objectID

保存

db.集合名字.save(document)

如果文档的id已经存在则对集合进行修改;否则就添加集合

简单查询

db.集合名字.find()

更新

db.集合名字.update(<query>,<update>,{multi:<boolean>})

参数query:查询条件

参数update:更新操作符

参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新

db.stu.update({name:'hr'},{name:'mc'})更新一条

db.stu.update({name:'hr'},{$set:{name:'mc'}})更新一条

db.stu.update({},{$set:{gender:0},{multi:true}})更新全部

注意:multi update only works with $ operators

删除

db.集合名字。remove(<query>,{juestOne:<boolean>}) 

参数query:可选,删除的文档的条件

参数justOne:可选,如果设为true或1,则只删除一条,默认是false,删除多条

 高级查询

 数据查询

db.集合名字.find({条件文档})

db.集合名字.findOne({条件文档})查询,只返回第一个

db.集合名字.find({条件文档}).pretty() 将结果格式化打印出来

 

比较运算符

等于:默认是等于判断,没有运算符

小于:$lt less than

小于等于:$lte less than equal

大于:$gt greater than

大于等于:$gte

不等于:$ne

范围运算符

使用$in,$nin判断是否在某个范围内

逻辑运算符 

and:在json中写多个条件即可

db.stu.find({age:{$gte:18}},{gender:true})

or:使用$or,值为数组,数组中的每个元素为json

db.stu.find({$or:[{age:{$gt:18},{gender:false}}]})

查询年龄大于18或性别为男性,并且姓名是郭靖

db.stu.find({$or:[{age:{$gt:18}},{gender:false}],name:'gj'})

支持正则表达式 

使用//或$regex编写正则表达式

db.stu.find({sku:/^abc/})

 db.stu.find({sku:{$regex:'789$'}})

limit和skip

db.集合名字.find().limit(number) 用于读取指定数量的文档

db.stu.find().limit(2)

db.集合名字.find().skip(number) 用于跳过指定数量的文档

db.stu.find().skip(2)

同时使用

db.stu.find().limit(2).skip(3)

自定义查询 

像之前进行操作的语句都是json,同样也可以对js进行操作。但是在Python的环境下,这部分是不会用到的

使用$where后面写一个函数,返回满足条件的数据

投影 

过滤查询的信息

在查询到的返回结果中,只选择必要的字段

db.集合名字.find({},{字段:1,字段:0,,,})

参数为字段与值,值1表示显示,值2表示不显示

对于_id默认是显示,如果不显示需要明确设置为0

排序 

方法sort(),对集合进行排序

db.集合名字.find().sort({字段:1,字段:2.。。。})

参数1为升序,-1为降序

根据性别排序,再根据年龄排序

db.stu.find().sort({gender:-1,age:1})

统计个数 

方法count()统计文档条数

db.集合名字.find({条件}).count()

db.集合名字.count({条件})

消除重复 

方法distinct()对数据进行去重

db.集合名字.distinct(“去重条件”,{条件})

db.stu.distinct('hometown',{age:{$lt:18}})

不会对原数据库中数据做操作

数据的备份与恢复 

备份的语法

在系统的终端输入以下命令:

mongodump -h dbhost -d dbname -o dbdirectory

-h:服务器地址,也可以指定端口号

-d:需要备份的数据库名称

-o:备份的数据的存放位置,此目录中存放着备份出来的数据

mongodunp -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢复的语法 

mongorestore -h dbhost -d dbname --dir dbdirectory

-h:服务器地址

-d:需要恢复的数据库实例(恢复后出现的新数据库)

--dir:备份数据所在位置(备份的老数据库)

mongorestore -h 192.168.196.12827017 -d test2 --dir ~/Desktop/test1bak/test1

 聚合命令

聚合aggregate是基于数据处理的聚合管道,每个文档通过一个由多个阶段stage组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果

db.集合名字.aggregate({管道:{表达式]})

 常用管道

在mongodb中,文档处理完毕后,通过管道进行下一次处理

$group:将集合中的文档分组,可用于统计结果

$match:过滤数据,只输出符合条件的文档

$project:修改输入文档的结构,如重命名,增加,删除字段,创建计算结果

$sort:将输入文档排序后输出

$limit:限制聚合管道返回的文档数

$skip:跳过指定数量的文档,并返回余下的文档

$unwind:将数组类型的字段进行拆分

表达式

处理输入文档并输出:

语法: 表达式:'$列名'

常用表达式:

$sum:计算总和,$sum:1表示以一倍计数

$avg:计算平均值

$min:获取最小值

$max:获取最大值

$push:在结果文档中插入值到一个数组中

$first:根据资源文档的排序获取第一个文档数据

$last:根据资源文档的排序获取最后一个文档数据

$group 

将集合中的文档分组,可用于统计结果

_id表示分组的依据,使用某个字段的格式为‘$字段’

依据多个条件进行分组

group by null 

将集合中所有文档分为一组

 $project

修改输入文档的结构,如重命名、增加、删除字段、创建计算结果

多个管道一起使用就要注意管道使用的先后顺序

 

$match 

用于过滤数据,只输出符合条件的文档

match是管道命令,能将结果交给后一个管道,但是find不能作为管道去用

练习 

 

 $sort

将输入文档排序后输出

查询学生信息,按年龄升序

db.stu.aggregate({$sort:{age:1}})

$limit和$skip

$limit限制管道返回的文档数

$skip跳过指定数量的文档,并返回余下的文档

注意顺序:先写skip,再写limit

 $unwind

将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值

db.集合名称.aggregate({$unwind:'$字段名称'})

 观察下图通过管道之后的结果,unwind将size字段中为空和null的值直接忽略了。实际情况中,不可以忽略空值,unwind就有以下用法

属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档

false表示丢弃属性值为空的文档

db.集合名字.aggregate(

{$unwind:

               {path:'$字段名称',

                 preserveNullAndEmptyArrays:<boolean>}

})

 

练习 

 

索引的建立 

创建索引

数据准备:插入10万条数据到数据库中

for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})}

使用find()查询name字段值为test10000,测试本次查询花费的时间

下面,创建索引

 db.集合.ensureIndex({属性:1}),1表示升序,-1表示降序

通常下面中numIndexsBefore:1中的1指的是原来_id创建的索引

创建过索引之后,再使用索引进行查询,并获取本次查询的时间:

db.t255.find({name:'test10000'}).explain('executionStats')

可见,索引是为了更快的提升查询速度

 查看当前集合的所有索引

db.集合.getIndexes()

 删除索引

db.集合.dropIndex('索引名称')

创建唯一索引(索引的值是唯一的) 

db.集合.ensureIndexp({'字段名字':1},{‘unique’:true})

使用场景:

爬虫数据去重:

使用数据库建立关键字段(一个或多个)索引进行去重

建立联合索引(什么时候需要联合索引)

db.集合.ensureIndex({字段1:1,字段2:1.。。。})

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值