暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MongoDB

码酱 2020-08-06
325



MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB 应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 

Mongodb适合大数据量的信息,丢失率相对就高,就存储一些相对于不太重要的信息,例如:微博的评论,淘宝的评论,网站流量的统计。


1.数据类型

MongoDB常见类型

说明

Object ID

文档ID

String

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

Boolean

存储一个布尔值,true或false

Integer

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

Double

存储浮点值

Arrays

数组(js)或列表(python),多个值存储到一个键

Object

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

Null

存储Null值

Timestamp

时间戳

Date

存储当前日期或时间的UNIX时间格式

2.数据库操作

命令

操作

show dbs

显示数据库列表

db

显示当前数据库

use 数据库名

切换或创建数据(有则切换,无则创建)

db.dropDatabase()

删除当前所在数据库(D大写)

  • 使用"show dbs"时,不显示空的数据库

  • 删除数据库前要切换到要删除的数据库,删除之后数据库内内容被清空,使用"show dbs"不显示,但是使用"db"命令的时候还会看到。

3.集合操作

关系型数据库中,每个库是由多张table组成,而NoSQL中,每个库是由多个集合(collection)组成,相当于sql中的table,集合中以键值对的形式保存数据。

命令

操作

db.createCollection(集合名, [参数])

创建集合(一般不用这种方式而

是在插入数据时自动创建)

show collections/show tables

查看集合

db.集合名.drop()

删除集合

4.数据操作(文档操作)

4.1增

db.集合名.insert({"键名1":值1, "键名2": 值2 ...})

  • 一条insert语句只能插入一行数据,insert后面不能跟多行数据。

4.2删

db.集合名.remove({查询条件}) 

db.集合名.remove({}) # 删除全部数据

  • db.集合名.remove({‘title’:’yes’}) 可删除,但是不会真正释放空间,需要继续执行db.repairDatabase()来回收磁盘空间

  • db.集合名.deleteMany({…}).   删除集合下的满足…的文档

4.3改

db.集合名.update({查询条件}, {修改后结果})

  • 这里要注意,修改后结果就是整行的最终结果,并且只会修改一行,而不是所有匹配结果都修改。

db.集合名.update({查找条件}, {$set:{"要修改的字段名1":修改后的值, "要修改的字段名2": "值2"}})

4.4查

db.集合名.findOne() # 查询一行 

db.集合名.find() # 查询全部 

db.集合名.find().pretty() # 格式化打印 

db.集合名.find({查找条件}) # 按条件查找

  • 查询结果:

    "_id"是mongoDB自动添加的主键。十六进制,每两个字符为一个字节,共12个字节,前4个字节为当前时间戳,接下来3个字节为机ID,再接下来2个是MongoDB的进程ID,最后是排序流水号。

4.5高级查询

4.5.1条件操作符

  $gt 大于       

  $lt 小于

  $gte 大于等于

  $lte 小于等于

  $ne 不等于

db.集合名.find({"键名": {比较运算符1:值1, 比较运算符2:值2} })

  • db.集合名.find({likes:{$gte:100}}). 查找likes大于等于100的数据

  • db.集合名.find({likes:{$gte:100,$lt:200}})  查找likes大于等于100且小于200的数据

4.5.2关键字   

       in/not in

db.集合名.find({"键名": {$in:[值1, 值2, 值3 ...]} })

db.集合名.find({"键名": {$nin:[值1, 值2, 值3 ...]} })

       size

db.集合名.find({"键名": {$size:n} })

  • 对于值为list的字段,可以对list的长度(即list当中值的个数)进行判断来查询。

        exists

db.集合名.find({"键名": {$exist: true|fase} }) # t、f要小写

  • 查询 包含/不包含 某个字段的数据

       or

db.集合名.find({$or:[{条件1}, {条件2}, {条件3}...]})

4.5.3模糊查询

db.集合名.find({"键名": js正则表达)

db.集合名.find({"name":/du/})# 查询name以du开头的数据 

4.5.4查询结果排序

db.集合名.find().sort({"键名": 1-1, "键名": 1-1...}) 

  • 1 为升序 -1 为降序

4.5.5限定返回结果数量

db.集合名.find().limit(n)

db.集合名.find().skip(n) # 跳过n条,返回从n+1k开始的数据 

db.集合名.find().skip(n).limit(m) # 跳过n条,返回后面的m条

4.5.6查询返回结果数量

db.集合名.find().count()

db.集合名.find().skip(n).count(true) #与skip结合使用时,要加true

4.5.7聚合函数aggregate()

db.集合名.aggregate([ { 管道1: {表达式1} }, { 管道1: {表达式1} }, { 管道1: {表达式1} }, ... ]) # 如果只有一个管道则去掉"[]"

  • 在aggregate()函数中,数据会依次通过每个管道进行筛选过滤,因此称其为管道。

管道

说明

$group

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

$match

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

$project

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

计算结果

$sort

将输入文档排序后输出

$limit

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

$skip

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

$unwind

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

  • 只能在$group管道中使用。

分组函数

说明

$sum

计算总和,$sum:1同count表示计数

$avg

计算平均值

$min

获取最小值

$max

获取最大值

$push

在结果文档中插入值到一个数组中,相当于拼接字段

$first

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

$last

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

  • 案例:

# 统计男女生人数 

db.集合名.aggregate( {$group: { _id:'$sex', count_sex:{$sum:1} } } );

返回:{ "_id" : "女", "count_sex" : 4 } { "_id" : "男", "count_sex" : 11 }

# 统计所有人平均年龄 

db.集合名.aggregate( {$group: { _id:null, 总人数:{$sum:1}, avg_age:{$avg:"$age"}, min_age:{$min:"$age"}, max_age:{$max:"$age"} } } );

返回:{ "_id" : null, "总人数" : 15, "avg_age" : 42.666666666666664, "min_age" : 29, "max_age" : 55 }

5.创建索引

    db.集合名.createIndex({“title”:1,”likes”:-1})  1为升序索引,-1为降序索引

    db.集合名.getIndexes().   查看索引

    db.集合名.totalIndexSize().  查看索引大小

    db.集合名.dropIndexes()   删除所有索引 

    db.集合名.dropIndex(“索引名称”)  删除指定索引


文章转载自码酱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论