MongoDB数据库的使用

MongoDB的优势

                        1.易扩展,这也是非关系数据库共有的优势

                        2.大数据量,高性能,非常高的读写性能

                        3.灵活的数据模型,无需事先为要存储的数据建立字段

MongoDB的安装

                          1.pip install mongodb

                           2. 启动:sudo service mongod start 或者 sudo mongod --config /usr/local/mongodb/mongodb.conf

                            3.停止:sudo service mongod stop

                            4.重启:sudo service mongod restart

                            5.查看是否启动成功:ps ajx|grep mongod

                            6.配置文件的位置:/etc/mongod.conf

                            7.默认端口:27017

                            8.日志的位置:/var/log/mongodb/mongod.log   

数据库的命令

1.查看当前的数据库:db

2.查看所有的数据库:show dbs

3.切换数据库:use 数据库名字

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

集合的命令

1.不手动创建集合:行不存在的集合中第一次加入数据时,集合会被创建出来

2.手动创建集合:db.createCollection(name,options)

例如:db.createCollection('sub',{capped:true,size:10})

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

参数size:指定文档上限,单位为字节,托超过上限,会将前面的文档覆盖

3.查看集合:show collections

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

数据类型

1.Object ID:文档ID

2.String:字符串,最常用

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

4.Integer:整数可以是32位或64位

5.Double:存储浮点值

6.Object:用于嵌入式的文档,即一个值为一个文档

7.Null:存储Null值

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

9.Date:存储当前日期或时间的UNIX时间格式

10.创建日期语句如下:参数的格式为YYYY-MM-DD

new Date('2020-01-01')

11.每个文档都有一个属性:_id 保证每个文档的唯一性

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

插入

1.db.集合名字.insert(document)

例如:db.stu.insert({_id:'20200101',name:'gj',gender:1})

保存

db.集合名字.save(document)

如果文档的_id已经存在则修改,不存在则添加

查询

db.集合名字.find()

更新

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

query:查询条件

update:更新操作符

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

例如:db.stu.update({name:'hr'},{name:'mnc'}) 更新一条,把全部内容替换

db.stu.update({name:'hr'},{$set:{name:'mnc'}}) 更新一条,指定一个键对应的值

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

删除

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

query:删除文档的条件

justOne:设置为ture或1,则只删除一条,默认false,表示删除多条

比较运算符

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

小于:$it

小于等于:$ite

大于:$gt

大于等于:$gte

不等于:$ne

例如:db.stu.find({age:{$lte:18}})


范围运算符

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

例如:db.stu.find({age:{$in:[18,28,38]}}) 


逻辑运算符

and:并且,和

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

or:使用$or,值为数组

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


高级查询

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

2.db.集合名字.findone({文档条件}) 只返回一条

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

4.支持正则表达式:使用//或$regex编写

例如:db.products.find({sku:/^abc/})

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

5.limit:用于读取指定数量得文档

例如:查询2条学生信息

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

6.skip:用于跳过指定数量得文档

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

可以同时使用db.stu.find().limit(3).skip(2)

7.自定义查询

使用$where后面写一个函数,返回满足条件得数据查询年龄大于30得学生

db.stu.find({$where:function(){return this.age>30;}})

8.投影:在查询到得返回结果中,只选择必要得字段db.集合名字.find({},{字段名称1,...})

参数为字段与值,值为1表示显示,值为0不显,特殊:对于_id列默认是显示得,如果不显示需要明确设置为0

例如:db.stu.find({},{_id:0,name:1,gender:1})

9.排序:方法sort(),用于对集进行排序

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

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

例如:根据性别降序,在根据年龄升序

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

10.统计个数:方法count()

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

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

db.stu.find({gender:ture}).count()

db.stu.count({age:{$gt:20},gender:true})


数据备份和恢复

数据备份

mongodump -h dbhost -d dbname -o dbdirectory

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

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

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

数据恢复

mongorestore -h dbhost -d dbname --dir dbdirectory

-h:服务器地址

-d:需要恢复的数据库实例

--dir:备份数据所在位置


聚合命令

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

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

常用管道命令

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

注意:1.$group对应的字典中有几个键,结果中就有几个键

2.分组依据需要放到'_id'后面

3.取不同的字段的值需要使用$,如'$age'

4.取字典嵌套的字典中的值的时候’$_id.country‘

5.能够同时按照多个键进行分组’{$grop:{_id:{country:'$country',province:'$province'}}}‘

结果是’{_id:{country:'',province:''}}‘

按照gender进行分组,获取不同数据的个数和平均年龄

db.stu.aggregate({$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:'$age'}}})

使用$group统计整个文档

db.stu.aggregate({$group:{_id:null,count:{$sum:1},mean_age:{$avg:'age'}}})

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


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



db.stu.aggregate({$group:{_id:null,count:{$sum:1},mean_age:{$avg:'age'}}},{$project:{gender:'%_id',count:1,'avg_age':1,_id:0}})

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

例如:查询男生,女生人数,并且按照降序排序

db.stu.aggregate{{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}}}

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

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

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

表达式

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

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

2.$avg:计算平均值

3.$min:获取最小值

4.$max:获取最大值

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

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

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

索引

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

例如:db.t1.ensureindex({name:1})

在默认情况下索引字段的值可以相同

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

db.t1.ensureIndex({'name':1},{'unique':true})

建立联合索引

db.t1.ensureIndex({name:1,age:1})

查看当前集合的所有索引:

db.t1.getIndexes()

删除索引:

db.t1.dropIndex('索引名称')

mongodb和python间交互

from pymongo import Mongoclient

client = MongoClient(host='127.0.0.1',port=27017)

collection = client['test']['t251']

插入一条数据

ret1 = collection.insert({'name':'xiaoming','age':18})

插入多条数据

data_list = [{'name':'test{}'.format(i)} for i in range(10)]

colletion.insert_many(data_list)

查询一个记录

t =collection.find_one({'name':'xiaowang'})

查询多条记录

collection.find({'name':'xiaowang'})

更新一条数据

collection.update_one({'name':'xiaowang'},{$set:{'name':'xiaohong'}})

更新全部数据

collection.update_many({'name':'xiaowang'},{'$set':{'name':'xiaohong'}})

删除一条

collection.delete_one({'name':'xiaowang'})

删除所有条件满足的数据

collection.delete_many({'name':'xiaowang'})

                

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

推荐阅读更多精彩内容