Mongodb数据库

什么是Mongodb数据库?

  • MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统
  • MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB特点

  • 模式自由 :可以把不同结构的文档存储在同一个数据库里
  • 面向集合的存储:适合存储 JSON风格文件的形式
  • 完整的索引支持:对任何属性可索引
  • 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
  • 自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
  • 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组
  • 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
    基本操作

三元素

  • 数据库:数据库是一个集合的物理容器,一个数据库中可以包含多个集合
    注:1.不能是空字符串("")。
    2.不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
    3.应全部小写。
    4.最多64字节

  • 集合:集合就是关系数据库中的表;类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中 {'name':'guojing','gender':'男'} {'name':'huangrong','age':18} {'book':'shuihuzhuan','heros':'108’}
    注:1.集合名不能是空字符串""。
    2.集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
    3.集合名不能以"system."开头,这是为系统集合保留的前缀。
    4.用户创建的集合名字不能含有保留字
    符。有些驱动程序的确支持在集合名里面包
    含,这是因为某些系统生成的集合中包含该
    字符。除非你要访问这种系统创建的集合,
    否则千万不要在名字里出现$。

  • 文档:文档对应着关系数据库中的行;就是一个对象,由键值对构成,是json的扩展Bson形式 {'name':'guojing','gender':'男’}
    注:1.文档中的键/值对是有序的。
    2.文档中的值不仅可以是在双引号里
    面的字符串,还可以是其他几种数据类
    型(甚至可以是整个嵌入的文档)。
    3.MongoDB区分类型和大小写。
    4.MongoDB的文档不能有重复的键。
    5.文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
    6.文档键命名规范:键不能含有\0 (空字符)。这个字符用来表示键的结尾;和$有特别的意义,只有在特定环境下才能使用。

数据库基本命令

  • 查看当前数据库名称
    db

  • 列出所有在物理上存在的数据库
    show dbs

  • 切换数据库 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建
    use 数据库名称

  • 查看当前数据库信息
    db.stats()

  • 数据库删除:删除当前指向的数据库,需要切换到需要删除的目标数据库中,如果数据库不存在,则什么也不做
    db.dropDatabase()

  • 创建集合
    非固定大小的集合
    db.createCollection('集合名称')
    固定大小的集合(当集合存满时,新的数据会覆盖之前的数据)
    db.createCollection('集合名称',{capped:true,size:指定集合的大小(单位是字节),max:指定集合中能存储的最大文档的数量})
    size优先级更高

  • 查看集合
    show collections

  • 删除集合
    db.集合名称.drop()

关于增删改查的操作

插入数据

  • 插入单条
    db.集合名称.insert({'key':'value'})

  • 插入多条
    db.集合名称.insert(
    [
    {'key':'value'},
    {'key':'value'},
    ]
    )

插入数据时如果没有指定,_id会帮您自动生成一个,也可以自己指定
这个id既是主键,也是一个索引

更新数据update

  • 全文档更新(由一个新的文档替换之前的文档,ID不变)
    db.集合名称.update(
    {'key':'value'}查询条件
    {'newkey':'newvalue'}新的文档
    {
    upsert:默认情况下为false,要更新的文档不存在,不会插入一条新数据,为true则相反
    multi:默认为false,只更新查找到的第一条,为true表示更新所有
    }

)

  • 局部更新
    db.集合名称.udpate(
    {'key':'value'}查询条件
    {
    $set:{'key':'newvalue'}
    }
    )

  • save:会根据id这个字段去集合下查找,如果id存在
    则进行全文档更新,如果不存在,则插入一条新数据
    db.集合名称.save(
    {id:'','key':'value'...}
    )

格式化输出

db.集合名称.find().pretty()

删除数据

  • 删除多条
    db.集合名称.remove(
    {'key':'value'}条件
    )

  • 删除单条
    db.集合名称.remove(
    {'key':'value'},条件
    1 表示的不是数量,表示的是true
    )

查询

  • db.集合名称.find() 查询所有
  • db.集合名称.find({'key':'value'}条件)
  • db.集合名称.findOne({'key':'value'}条件)

比较运算符

  • 等于
  • 小于$lt
  • 小于等于$lte
  • 大于$gt
  • 大于或等于$gte
  • 不等于$ne

db.集合名称.find(
{time:{$gte:100}}
)

多条件查询
db.集合名称.find(
{
time:{$ge:100},
actors:'李连杰'
}
)

逻辑或¥$or

db.movie.find(
{
$or:
[

{ time : {$gt:100}},
{autor:'李连杰'}
],
'title':'少林寺'
}
)

范围运算符

$in:在..范围

使用正则查询

db.集合名称.find(
{
key:/^正则表达式/
}
)

db.集合名称.find(
{
key:{$regex:'正则表达式'}
}
)

$type 只返回符合数据类型的文档

db.集合名称.find(
{

key:{$type:'数据类型'}
}
)

limit 限制返回

skip 跳过指定的条数

db.集合名称.find().limit(num).skip(num)
注意:limit和skip先后顺序不影响结果

sort jinxing paixu 1:升序: -1:降序

db.集合名称.find.sort({key:方向(1 or -1),key2:方向(1 or -1)})

去重

db.集合名称.distnict(
‘去重字段’,
{'条件'}

投影:project,可以选择查询结果中,数据的展示和隐藏

0表示隐藏,1表示显示
db.集合名称.find(
{'条件'}
{'key':1}
)
假如再设置要显示的字段时,第一个字段设置为1,只展示这一个,其他的都不展示
繁殖。只隐藏当前的字段,其他的字段都会展示出来

count:统计文档个数

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

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

mongodb的聚合

  • MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
    aggregate() 方法的基本语法格式如下所示:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

管道的概念

  • 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
  • MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
  • 表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

聚合框架常用的操作

  • $group:将集合中的文档分组,可用于统计结果。
  • $project:修改输入文档的结构。可以用来重命名、增加或
    删除域,也可以用于创建计算结果以及嵌套文档。
  • $$match:用于过滤数据,只输出符合条件的文档。$match使
    用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文
    档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条
    包含数组中的一个值。
  • $sort:将输入文档排序后输出。

聚合的表达式:

  • $sum 计算总和。
db.mycol.aggregate(
    [
        {$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}
    ]
)
  • $avg 计算平均值
db.mycol.aggregate(
    [
        {$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}
    ]
)
  • $min 获取集合中所有文档对应值得最小值。
db.mycol.aggregate(
    [
        {$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}
    ]
)
  • $max 获取集合中所有文档对应值得最大值。
db.mycol.aggregate(
    [
        {$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}
    ]
)
  • $push 在结果文档中插入值到一个数组中。
db.mycol.aggregate(
    [
        {$group : {_id : "$by_user", url : {$push: "$url"}}}
    ]
)
  • $first 根据资源文档的排序获取第一个文档数据。
db.mycol.aggregate(
    [
        {$group : {_id : "$by_user", first_url : {$first : "$url"}}}
    ]
)
  • $last 根据资源文档的排序获取最后一个文档数据
db.mycol.aggregate(
    [
        {$group : {_id : "$by_user", last_url : {$last : "$url"}}}
    ]
)
  • $$group将集合中的文档分组,可用于统计结果,_id表示分组的依据,使用某个字段的格式为'$字段'
db.article.aggregate(
    [
        {$group:{_id:'$by_user',counter:{$sum:1}}}
    ]
)
  • Group by null 将集合中所有文档分为一组
db.article.aggregate(
    [
        {$group:{_id:null,counter:{$sum:1},likes:{$avg:"$likes"}}}
    ]
)
  • $project 修改输入文档的结构, 可以用来重命名增加或删除域也可以用于创建计算结果以及嵌套文档
db.article.aggregate(
    [
        {$project:{by_user:1}}
    ]
)

db.article.aggregate(
    [
        {$project:{by_user:1,id:0}}
    ]
)
  • $$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作
db.article.aggregate(
    [
        {$match:{likes:{$gt:0,$lte:20}}},
        {$project:{title:1,_id:0}}
    ]
)
  • $limit:用来限制MongoDB聚合管道返回的文档数。从集合的起始位置查找,限制返回两条
db.article.aggregate(
    [
        {$limit:2}
    ]
)
  • $skip在聚合管道中跳过指定数量的文档,并返回余下的文档
db.article.aggregate(
    [
        {$skip:2}
    ]
) #在聚合管道中跳过指定数量的文档,并返回余下的文档。
db.article.aggregate(
    [
        {$match:{likes:{$gt:0,$lte:20}}},
        {$skip:2},
        {$project:{title:1}}
    ]
)

db.article.aggregate(
    [
        {$match:{likes:{$gt:0,$lte:20}}},
        {$skip:1},
        {$limit:1},
        {$project:{title:1}}
    ]
)
  • $sort:将输入文档排序后输出
db.article.aggregate(
    [
        {$match:{likes:{$gt:0,$lte:800}}},
        {$sort:{likes:-1}}
    ]
)
  • $unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
db.article.aggregate(
    [
        {$unwind:'$tags'}
    ]
)

Mongodb管理员权限(安全方面)

超级管理员
为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户
采用了角色-用户-数据库的安全管理方式 常用系统角色如下:

  • root:只在admin数据库中可用,超级账号,超级权限
  • Read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库

创建超级管理用户

use admin
db.createUser(
    {   
   user:'admin',
    pwd:'123',
    roles:[{role:'root',db:'admin'}]
    }
)

Mongodb的备份和恢复

MongoDB 备份(mongodump)
在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。

mongodump -h dbhost -d dbname -o dbdirectory

  • -h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

  • -d: 需要备份的数据库实例,例如:test

  • -o: 备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

  • 如果没有开启权限

mongodump -h 127.0.0.1:27017 -d 数据库名称 -o ~/Desktop/数据库备份的路径
mongodump -h 127.0.0.1:27017 -o ~/Desktop/数据库备份的路径

  • 如果开启了权限设置(使用超级管理员权限)
    我们也可以使用账号密码的方式备份指定用户的数据库
    设置了超级管理员也可以使用如下方法备份

mongodump -u username -p password --authenticationDatabase 'admin' -d dbname -o dbpath

恢复备份
mongodb使用 mongorestore 命令来恢复备份的数据。

mongorestore -h hostname:port -d dbname --dir path

  • -h (host): MongoDB所在服务器地址,默认为: localhost:27017

  • -d (db): 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

  • --dir: 指定备份的目录

  • 如果没有开启权限

mongorestore -h 127.0.0.1:27017 -d 数据库名称 --dir 数据库备份文件路径
mongorestore -h 127.0.0.1 -dir 数据库备份文件路径

  • 下面是我添加了管理员权限之后的备份命令

如果开启了权限设置(使用超级管理员权限)

mongorestore -u username -p password --authenticationDatabase 'admin' -d 数据库名称 --dir 数据库备份文件路径

MongoDB数据导入与导出
导出工具:mongoexport

mongoexport -d dbname -c collectionname -o file --type json/csv -f field
参数说明:

  • d :数据库名
  • c :collection名
  • o :输出的文件名
  • -type : 输出的格式,默认为json
  • f :输出的字段,如果-type为csv,则需要加上-f "字段名"

示例:

导出json

mongoexport -d class1804 -c books -o ~/桌面/dump/books.json --type json

导出csv

mongoexport -d class1804 -c books -o ~/桌面/dump/books.csv --type csv -f 'by_user,likes'

数据导入:mongoimport

mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv

参数说明:

  • d:数据库名
  • c:collection名
  • -type:导入的格式默认json
  • f:导入的字段名
  • -headerline:如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
  • -file:要导入的文件

示例:

导入json

mongoimport -d class1712B -c books --file ~/桌面/dump/books --type json

导入csv

mongoimport -d class1712B -c info --file ~/桌面/dump/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容