Python3 数据库mongo(全局性知识点,全而紧凑)

整理于2020年10月下旬,献给不甘平凡的你

更多python3基础知识请查收于:https://blog.csdn.net/weixin_45316122/article/details/109843899

Trick:mongo数据库是python爬虫工作用的最多的,Robomongo 你需要了解以下,反正数据来来往往先入库保存,准没错。拥有redis 的RedisDesktopManager

目录

 

一、mongodb简介

1、数据类型

2、安装

3、配置

二、数据库操作

1、数据库切换

2、数据库删除

3、集合创建

4、集合操作

三、数据操作

1、插入(insert)

2、查询(find)

3、更新(update)

4、保存(save)

5、删除(remove)

6、关于size的示例

四、数据查询

1、基础查询

2、运算符

3、Limit和skip

4、投影

5、排序

6、统计个数

7、消除重复

五、聚合操作

1、聚合 aggregate

2、$group

3、$match

4、$project

5、$sort

6、$limit

7、$skip

8、$unwind

六、用户管理

1、超级管理员

2、启用安全认证

3、普通用户管理

4、删除用户

七、数据备份和恢复

1、复制(主从设置)

2、数据备份

3、数据恢复

八、与python交互


一、mongodb简介

MongoDB 是一个基于分布式 文件存储的NoSQL数据库,由C++语言编写,运行稳定,性能高,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案

MongoDB特点

  • 模式自由 :可以把不同结构的文档存储在同一个数据库里

  • 面向集合的存储:适合存储 JSON风格文件的形式

  • 完整的索引支持:对任何属性可索引

  • 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移

  • 自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器

  • 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组

  • 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划

  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)

  • MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成

  • MongoDB文档类似于JSON对象,字段值可以包含其他文档、数组、文档数组

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins 表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

mongodb三元素:数据库,集合,文档

  • 集合就是关系数据库中的表

  • 文档对应着关系数据库中的行

  • 文档,就是一个对象,由键值对构成,是json的扩展Bson形式

{'name':'laoli','gender':'男'}
  • 集合:类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中

{'name':'laozhang','gender':'男'}
{'name':'laozhang','age':18}
  • 数据库:是一个集合的物理容器,一个数据库中可以包含多个文档

  • 一个服务器通常有多个数据库

1、数据类型

  • 下表为MongoDB中常用的几种数据类型:

  • Object ID:文档ID

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

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

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

  • Double:存储浮点值

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

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

  • Null:存储Null值

  • Timestamp:时间戳

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

object id

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

  • 可以自己去设置_id插入文档

  • 如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID

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

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

    • 接下来3个字节的机器ID

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

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

 

2、安装

下载mongodb的版本,两点注意

  • 根据业界规则,偶数为稳定版,如1.6.X,奇数为开发版,如1.7.X

  • 32bit的mongodb最大只能存放2G的数据,64bit就没有限制

到官网,选择合适的版本下载

  • 解压

tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
  • 移动到/usr/local/目录下

sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
  • 将可执行文件添加到PATH路径中

export PATH=/usr/local/mongodb/bin:$PATH

3、配置

配置文件在/etc/mongod.conf

$ sudo vi /etc/mongod.cof

默认端口27017

 

启动

sudo service mongod start

停止

sudo service mongod stop

终端进入mongodb

这个shell就是mongodb的客户端,同时也是一个js的编译器

mongo

终端退出

exit
或ctrl+c

 

二、数据库操作

1、数据库切换

查看当前数据库名称

db

 

查看当前数据库信息show

db.stats()

 

查看所有在物理上存在的数据库

show dbs

切换数据库、创建数据库

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

use 数据库名称

默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中

2、数据库删除

  • 删除当前指向的数据库

  • 如果数据库不存在,则什么也不做

db.dropDatabase()

3、集合创建

语法

db.createCollection(name, options)
  • name是要创建的集合的名称

  • options是一个文档,用于指定集合的配置

  • 选项参数是可选的,所以只需要到指定的集合名称。以下是可以使用的选项列表:

  • 例1:不限制集合大小

db.createCollection("mongo")

 

  • 例2:限制集合大小,后面学会插入语句后可以查看效果

  • 参数capped:默认值为false表示不设置上限,值为true表示设置上限

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

db.createCollection("mongo2", { capped : true, size : 10 } )

 

4、集合操作

1、查看当前数据库的集合

show collections

 

2、删除集合

db.集合名称.drop()

 

三、数据操作

1、插入(insert)

语法

db.集合名称.insert(document)

插入文档时,如果不指定id参数,MongoDB会为文档分配一个唯一的ObjectId

例1、插入数据时不指定_id

db.mongo2.insert({name:'laoli',age:18})

 

例2、插入数据时指定id

s1={_id:'1',name:'hr',gender:'男'}
db.mongo2.insert(s1)

 

2、查询(find)

语法

db.集合名称.find()

 

 

3、更新(update)

语法

db.集合名称.update(
   <query>,  
   <update>,
   {multi: <boolean>}
)
  • 参数query:查询条件,类似sql语句update中where部分

  • 参数update:更新操作符,类似sql语句update中set部分

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

  • 例3:全文档更新(修改整条数据)

db.mongo3.update({name:'python'},{name:'php'})

 

  • 例4:指定属性更新(只修改指定的属性,其他属性数据不变),通过操作符$set

db.mongo3.update({name:'python'},{$set:{name:'php'}})

 

  • 例5:修改多条匹配到的数据

db.mongo3.update({name:'php'},{$set:{name:'java'}},{multi:true})

 

4、保存(save)

语法

db.集合名称.save(document)

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

例1、 数据不存在的情况下

db.mongo3.save({_id:'100','name':'python',gender:1})

 

例2、数据存在的情况下

db.mongo3.save({_id:'100','name':'php'})

 

insert和save的区别:

insert: 若新增数据的主键已经存在,则会抛出org.springframework.dao.DuplicateKeyException异常提示主键重复,不保存当前数据。

save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。

5、删除(remove)

  • 语法

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

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

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

 

例:只删除匹配到的第一条

db.mongo3.remove({name:'java'},{justOne:true})

 

 

例:全部删除

db.stu.remove({})

 

 

6、关于size的示例

创建集合

db.createCollection('mongo4',{capped:true,size:10})

插入第一条数据库查询

db.mongo4.insert({name:'python',num:1})

如果集合里面的数据就满了,这个时候后面插入进去的数据就会将最开始进去的给替代掉。

四、数据查询

1、基础查询

方法find():

查询

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

 

 

方法findOne():

查询,只返回第一个

db.集合名称.findOne({条件文档})

 

 

方法pretty():

将结果格式化

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

 

2、运算符

比较运算符

等于默认是等于判断,没有运算符
小于$lt
小于或等于$lte
大于$gt
大于或等于$gte
不等于$ne

例1:查询num等于'4'的数据

db.mongo4.find({num:'4'})

 

例2:查询num大于或等于4的数据

db.mongo4.find({num:{$gte:4}})

 

逻辑运算符

  • 查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接

  • 逻辑与:默认是逻辑与的关系

  • 例3:查询年龄大于或等于18,并且性别为1的学生

db.stu.find({age:{$gte:18},gender:1})
  • 逻辑或:使用$or

  • 例4:查询年龄大于18,或性别为0的学生

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


  • and和or一起使用

  • 例5:查询年龄大于18或性别为0的学生,并且学生的姓名为gj

db.stu.find({$or:[{age:{$gte:18}},{gender:0}],name:'gj'})
db.stu.find(
	{
        $or:[
        {age:{$gt:99}},
        {age:{$lt:10}}
        ],
        gender:1
	}
)

范围运算符

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

  • 例6:查询年龄为3、5的学生

db.stu.find({age:{$in:[3,5]}})

db.stu.find(
		{
            _id:{$in:[5,10]}
		}
)

db.stu.find({
    _id:{$gte:5},
    _id:{$lte:10}
})

支持正则表达式

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

  • 例7:查询姓黄的学生

db.stu.find({name:/^py/})
db.stu.find({name:{$regex:'^黄'}}})

自定义查询

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

  • 例7:查询年龄大于30的学生

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

3、Limit和skip

 

limit

  • 方法limit():用于读取指定数量的文档

  • 语法:

db.集合名称.find().limit(NUMBER)
  • 参数NUMBER表示要获取文档的条数

  • 如果没有指定参数则显示集合中的所有文档

  • 例1:查询2条学生信息

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

skip

  • 方法skip():用于跳过指定数量的文档

  • 语法:

db.集合名称.find().skip(NUMBER)
  • 参数NUMBER表示跳过的记录条数,默认值为0

  • 例2:查询从第3条开始的学生信息

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

limit配合skip使用

  • 方法limit()和skip()可以一起使用,不分先后顺序

  • 创建数据集

for(i=0;i<15;i++){db.t1.insert({_id:i})}
  • 查询第5至8条数据

db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)

4、投影

  • 在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段

  • 如:一个文档有5个字段,需要显示只有3个,投影其中3个fin字段即可

  • 语法:

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

db.集合名称.find({},{字段名称:1,...})
  • 对于需要显示的字段,设置为1即可,不设置即为不显示

  • 特殊:对于_id列默认是显示的,如果不显示需要明确设置为0

  • 例1

db.stu.find({},{name:1,gender:1})
  • 例2

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

5、排序

  • 方法sort(),用于对结果集进行排序

  • 语法

db.集合名称.find().sort({字段:1,...})
  • 参数1为升序排列

  • 参数-1为降序排列

  • 例1:根据性别降序,再根据年龄升序

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

 

6、统计个数

  • 方法count()用于统计结果集中文档条数

  • 语法

db.集合名称.find({条件}).count()
  • 也可以与为

db.集合名称.count({条件})
  • 例1:统计男生人数

db.stu.find({gender:1}).count()
  • 例2:统计年龄大于20的男生人数

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

7、消除重复

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

  • 语法

db.集合名称.distinct('去重字段',{条件})
  • 例1:查找年龄大于18的性别(去重)

db.stu.distinct('gender',{age:{$gt:18}})

 

五、聚合操作

  • 讲解关于mongodb的高级操作,包括聚合、主从复制、分片、备份与恢复、MR

  • 完成python与mongodb的交互

 

1、聚合 aggregate

  • 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()

  • 语法

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

管道

  • 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入

ps ajx | grep mongo
  • 在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理

  • 常用管道

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

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

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

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

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

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

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

表达式

  • 处理输入文档并输出

表达式:'$列名'
  • 常用表达式

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

    • $avg:计算平均值fir

    • $min:获取最小值

    • $max:获取最大值

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

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

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

 

2、$group

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

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

  • 例1:统计男生、女生的总人数

  db.stu.aggregate([
      {$group:
          {
              _id:'$gender',
              counter:{$sum:1}
          }
      }
  ])

Group by null

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

  • 例2:求学生总人数、平均年龄

  db.stu.aggregate([
      {$group:
          {
              _id:null,
              counter:{$sum:1},
              avgAge:{$avg:'$age'}
          }
      }
  ])

透视数据

  • 例3:统计学生性别及学生姓名

  db.stu.aggregate([{$group:{_id:'$gender',name:{$push:'$name'}}}])
  • 使用$$ROOT可以将文档内容加入到结果集的数组中,代码如下

  db.stu.aggregate([
      {$group:
          {
              _id:'$gender',
              counter:{$sum:1},
              avgAge:{$avg:'$age'}
              name:{$push:'$$ROOT'}
          }
      }
  ])
    db.stu.aggregate([
      {$group:
          {
              _id:'$gender',
              counter:{$sum:1},
              avgAge:{$avg:'$age'},
              name:{$push:'$name'}
          }
      }
  ])
  
  
 { "_id" : 0, 
 "name" : [ { "_id" : 6, "name" : "小鱼", "age" : 9, "gender" : 0 }, 
 			{ "_id" : 7, "name" : "小月", "age" : 9, "gender" : 0 },
            { "_id" : 8, "name" : "虎虎", "age" : 14, "gender" : 0 }, 
            { "_id" : 9, "name" : "貂蝉", "age" : 98, "gender" : 0 }, 
            { "_id" : 12, "name" : "西施", "age" : 78, "gender" : 0 }, 
            { "_id" : 13, "name" : "小红", "age" : 28, "gender" : 0 }, 
            { "_id" : 14, "name" : "小蓝", "age" : 28, "gender" : 0 }, 
            { "_id" : 11, "name" : "大妞", "age" : 28, "gender" : 0 }, 
        ] }
        
{ "_id" : 1,
"name" : [	{ "_id" : 1, "name" : "小刘", "age" : 18, "gender" : 1 }, 
			{ "_id" : 2, "name" : "小张", "age" : 19, "gender" : 1 }, 
			{ "_id" : 3, "name" : "关羽", "age" : 99, "gender" : 1 },
            { "_id" : 4, "name" : "关羽", "age" : 999, "gender" : 1 }, 
            {"_id" : 5, "name" : "关门", "age" : 9, "gender" : 1 },
            { "_id" : 10, "name" : "吕布", "age" : 98, "gender" : 1 }, 
            { "_id" : 15, "name" : "老猪", "age" : 84, "gender" : 1 }, 
            { "_id" : 17, "name" : "穿关成功", "age" : 67, "gender" : 1 }, 
            { "_id" : 18, "name" : "关羽", "age" : 99, "gender" : 1 }, 
            "_id" : 19, "name" : "关羽", "age" : 999, "gender" : 1 }, 
            { "_id" : 20, "name" : "关羽", "age" : 999, "gender" : 1 } 
            ] }

3、$match

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

  • 使用MongoDB的标准查询操作

  • 例1:查询年龄大于20的学生

db.stu.aggregate([
    {$match:{_id:{$gte:5}}},
    {$match:{_id:{$lte:10}}}
])
  • 例2:查询年龄大于20的男生、女生人数

db.stu.aggregate([
    			{$match:{age:{$gt:20}}}, 
    			{$group:{	
    					_id:'$gender',
    					counter:{$sum:1},
    					avg_age:{$avg:'$age'},
    					name:{$push:'$name'}
    					}
    			}
				])
				
				



4、$project

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

  • 例1:查询学生的姓名、年龄

db.stu.aggregate([
    {$project:{_id:0,name:1,age:1}}
])
  • 例2:查询男生、女生人数,输出人数

db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$project:{_id:0,counter:1}}
])

5、$sort

  • 将输入文档排序后输出

  • 例1:查询学生信息,按年龄升序

b.stu.aggregate([{$sort:{age:1}}])
  • 例2:查询男生、女生人数,按人数降序

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

6、$limit

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

  • 例1:查询2条学生信息

db.stu.aggregate([{$limit:2}])

7、$skip

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

  • 例2:查询从第3条开始的学生信息

db.stu.aggregate([{$skip:2}])
  • 例3:统计男生、女生人数,按人数升序,取第二条数据

db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$sort:{counter:1}},
    {$skip:1},
    {$limit:1}
])
  • 注意顺序:先写skip,再写limit

8、$unwind

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

语法1

  • 对某字段值进行拆分

db.集合名称.aggregate([{$unwind:'$字段名称'}])
  • 构造数据

db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
  • 查询

db.t2.aggregate([{$unwind:'$size'}])

语法2

  • 对某字段值进行拆分

  • 处理空数组、非数组、无字段、null情况

db.inventory.aggregate([{
    $unwind:{
        path:'$字段名称',
        preserveNullAndEmptyArrays:<boolean>#防止数据丢失
    }
}])
  • 构造数据

db.stu.insert([
{ "_id" : 22, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 23, "item" : "b", "size" : [ ] },
{ "_id" : 24, "item" : "c", "size": "M" },
{ "_id" : 25, "item" : "d" },
{ "_id" : 26, "item" : "e", "size" : null }
])
  • 使用语法1查询

db.stu.aggregate([{$unwind:'$size'}])
  • 查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了

  • 问:如何能不丢弃呢?

  • 答:使用语法2查询

db.stu.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])

六、用户管理

1、超级管理员

  • 为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户

  • 采用了角色-用户-数据库的安全管理方式

  • 常用系统角色如下:

    • root:只在admin数据库中可用,超级账号,超级权限

    • Read:允许用户读取指定数据库

    • readWrite:允许用户读写指定数据库

  • 创建超级管理用户

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

2、启用安全认证

  • 修改配置文件show

sudo vi /etc/mongod.conf
  • 启用身份验证

  • 注意:keys and values之间一定要加空格, 否则解析会报错

security:
  authorization: enabled
  • 重启服务

sudo service mongod stop
sudo service mongod start
  • 终端连接

 mongo -u 'admin' -p '123' --authenticationDatabase 'admin'

3、普通用户管理

  • 使用超级管理员登录,然后进入用户管理操作

  • 查看当前数据库的用户

use test1
show users
  • 创建普通用户

db.createUser({
    user:'laowang',
    pwd:'123',
    roles:[{role:'readWrite',db:'sxt'}]
})
  • 终端连接

mongo -u laowang -p 123 --authenticationDatabase test1
  • 切换数据库,执行命令查看效果

  • 修改用户:可以修改pwd、roles属性

db.updateUser('laowang',{pwd:'456'})

4、删除用户

登录管理员账户,进入admin中进行删除

> db.system.users.remove({user:"laowang"})
> db.system.users.find()

 

 

七、数据备份和恢复

1、复制(主从设置)

什么是复制

  • 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性

  • 复制还允许从硬件故障和服务中断中恢复数据

为什么要复制

  • 数据备份

  • 数据灾难恢复

  • 读写分离

  • 高(24* 7)数据可用性

  • 无宕机维护

  • 副本集对应用程序是透明

复制的工作原理

  • 复制至少需要两个节点A、B...

  • A是主节点,负责处理客户端请求

  • 其余的都是从节点,负责复制主节点上的数据

  • 节点常见的搭配方式为:一主一从、一主多从

  • 主节点记录在其上的所有操作,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致

  • 主节点与从节点进行数据交互保障数据的一致性

复制的特点

  • N 个节点的集群

  • 任何节点可作为主节点

  • 所有写入操作都在主节点上

  • 自动故障转移

  • 自动恢复

设置复制节点

  • 接下来的操作需要打开多个终端窗口,而且可能会连接多台ubuntu主机,会显得有些乱,建议在xshell中实现

  • step1:创建数据库目录t1、t2

  • 在Desktop目录下演示,其它目录也可以,注意权限即可

mkdir t1
mkdir t2
  • step2:使用如下格式启动mongod,注意replSet的名称是一致的

mongod --bind_ip 192.168.0.103 --port 27018 --dbpath ~/Desktop/t1 --replSet rs0
mongod --bind_ip 192.168.0.103 --port 27019 --dbpath ~/Desktop/t2 --replSet rs0
  • step3:连接主服务器,此处设置192.168.196.128:27017为主服务器

mongo --host 192.168.0.103 --port 27017
  • step4:初始化

rs.initiate()

 

  • step5:查看当前状态

rs.status()

 

  • step6:添加复本集

rs.add('192.168.0.103:27019')

 

  • step8:连接第二个mongo服务

mongo --host 192.168.196.128 --port 27018

 

  • step9:向主服务器中插入数据

use test1
for(i=0;i<10;i++){db.t1.insert({_id:i})}
db.t1.find()
  • step10:在从服务器中插查询

  • 说明:如果在从服务器上进行读操作,需要设置rs.slaveOk()

rs.slaveOk()
db.t1.find()

其它说明

  • 删除从节点

rs.remove('192.168.196.128:27018')
  • 关闭主服务器后,再重新启动,会发现原来的从服务器变为主服务器,新启动的服务器(原来的从服务器)变为了从服务器

2、数据备份

  • 语法

mongodump -h dbhost -d dbname -o dbdirectory
  • -h:服务器地址,也可以指定端口号

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

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

  • 例1

sudo mkdir sxtbak
sudo mongodump -h 192.168.0.103:27017 -d sxt -o ~/Desktop/sxtbak

3、数据恢复

  • 语法

mongorestore -h dbhost -d dbname --dir dbdirectory
  • -h:服务器地址

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

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

  • 例2

mongorestore -h 192.168.0.103:27017 -d sxt --dir ~/Desktop/sxtbak/sxt

八、与python交互

点击查看官方文档

安装python包

进入虚拟环境
sudo pip install pymongo
或源码安装
python setup.py

引入包pymongo

import pymongo

连接,创建客户端

client=pymongo.MongoClient("localhost", 27017)

选取数据库test1

db=client.test1

选取集合stu

stu = db.stu
主要方法:
    find_one:查找一条文档对象
    find:查找多条文档对象
    
    insert_one:加入一条文档对象
    insert_many:加入多条文档对象

    update_one:更新一条文档对象
    update_many:更新多条文档对象
    
    delete_one:删除一条文档对象
    delete_many:删除多条文档对象

查找

获取一条数据

s2=stu.find_one()

获取多条数据

for cur in stu.find():
    print cur

查找多个文档2

cur=stu.find()
cur.next()
cur.next()
cur.next()

获取文档个数

print stu.count()

 

 

插入

# 插入一条
db.stu.insert_one({"name": "小霸王", "age": 44})
# 插入多条
db.stu.insert_many([{"name": "小霸王2", "age": 44},{"name": "小霸王3", "age": 44}])

修改

# 修改第一条符合条件的数据,传入条件和修改结果
# db.stu.update_one({"age": 44},{"$set": {"age": 100}}) 
# 所有符合条件数据都修改
db.stu.update_many({"age": 44},{"$set": {"age": 100}}) 

删除

# 修改第一条符合条件的文档删除
db.stu.delete_one({"age": 100}) 
# 所有符合条件数据都删除
db.stu.delete_many({"age": 100}) 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值