Python测开28期-偕行-MongoDB数据库

一、MongoDB介绍

image

  • MongoDB是一个基于分布式文件存储的数据库
  • 由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  • 它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
  • Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

业务应用场景

传统的关系型数据库(如MySQL),在数据操作的三高需求以及应对Web2.0的网站需求面前,显得力不从心,而 MongoDB可应对“三高“需求;

  • High performance:对数据库高并发读写的需求
  • Huge Storage:对海量数据的高效率存储和访问的需求
  • High Scalability && High Availability:对数据库的高可扩展性和高可用性的需求

具体应用场景:

  • 社交场景,使用 MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。

  • 游戏场景,使用 MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。

  • 物流场景,使用 MongoDB存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来

  • 物联网场景,使用 MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。

  • 视频直播,使用 MongoDB存储用户信息、点赞互动信息等。

  • 这些应用场景中,数据操作方面的共同特点是:

    • (1)数据量大
    • (2)写入操作频繁(读写都很频繁)
    • (3)价值较低的数据,对事务性要求不高

什么时候选择MongoDB

  • 应用不需要事务及复杂join支持
  • 新应用,需求会变,数据模型无法确定,想快速迭代开发
  • 应用需要2000-3000以上的读写QPS(更高也可以)
  • 应用需要TB甚至PB级别数据存储
  • 应用要求存储的数据不丢失
  • 应用需要99.999%高可用
  • 应用需要大量的地理位置查询、文本查询

MongoDB 数据库的一些特性

  • 面向文档存储,基于JSON/BSON 可表示灵活的数据结构
  • 动态 DDL能力,没有强Schema约束,支持快速迭代
  • 高性能计算,提供基于内存的快速数据查询
  • 容易扩展,利用数据分片可以支持海量数据存储
  • 丰富的功能集,支持二级索引、强大的聚合管道功能,为开发者量身定做的功能,如数据自动老化、固定集合等等。
  • 跨平台版本、支持多语言SDK…

MongoDB数据基本模型(与关系型数据库进行类比理解)

整体框架类比

image

  • database 数据库,与SQL的数据库(database)概念相同,一个数据库包含多个集合(表)
  • collection 集合,相当于SQL中的表(table),一个集合可以存放多个文档(行)。 不同之处就在于集合的结构(schema)是动态的,不需要预先声明一个严格的表结构。更重要的是,默认情况下 MongoDB 并不会对写入的数据做任何schema的校验。
  • document 文档,相当于SQL中的行(row),一个文档由多个字段(列)组成,并采用bson(json)格式表示。
  • field 字段,相当于SQL中的列(column),相比普通column的差别在于field的类型可以更加灵活,比如支持嵌套的文档、数组。
  • 此外,MongoDB中字段的类型是固定的区分大小写、并且文档中的字段也是有序的

关键字类比

image

  • _id 主键,MongoDB 默认使用一个_id 字段来保证文档的唯一性。
  • reference 引用,勉强可以对应于 外键(foreign key) 的概念,之所以是勉强是因为 reference 并没有实现任何外键的约束,而只是由客户端(driver)自动进行关联查询、转换的一个特殊类型。
  • view 视图,MongoDB 3.4 开始支持视图,和 SQL 的视图没有什么差异,视图是基于表/集合之上进行动态查询的一层对象,可以是虚拟的,也可以是物理的(物化视图)。
  • index 索引,与SQL 的索引相同。
  • $lookup,这是一个聚合操作符,可以用于实现类似 SQL-join 连接的功能
  • transaction 事务,从 MongoDB 4.0 版本开始,提供了对于事务的支持
  • aggregation 聚合,MongoDB 提供了强大的聚合计算框架,group by 是其中的一类聚合操作。

MongoDB 能不能用 SQL进行查询?

  • 当然是可以!但需要注意这些功能并不是 MongoDB 原生自带的,而需要借由第三方工具平台实现:

    • 客户端使用SQL,可以使用 mongobooster、studio3t 这样的工具
    • 服务端的话,可以看看 presto 之类的一些平台…

BSON 数据类型

  • MongoDB 文档可以使用 Javascript 对象表示,从格式上讲,是基于 JSON 的。
  • JSON 有自己的短板,比如无法支持像日期这样的特定数据类型,因此 MongoDB 实际上使用的是一种扩展式的JSON,叫 BSON(Binary JSON)。

BSON 所支持的数据类型

分布式ID

  • 为了实现分布式数据ID的唯一性保证,应用开发者提出了自己的方案,而大多数方案中都会将ID分段生成,如著名的 snowflake 算法中就同时使用了时间戳、机器号、进程号以及随机数来保证唯一性。

  • MongoDB 采用 ObjectId 来表示主键的类型,数据库中每个文档都拥有一个_id 字段表示主键。
    _id 的生成规则如下:

    • 4-byte Unix 时间戳
    • 3-byte 机器 ID
    • 2-byte 进程 ID
    • 3-byte 计数器(初始化随机)
      image
  • _id 的生成实质上是由客户端(Driver)生成的,这样可以获得更好的随机性,同时降低服务端的负载。当然服务端也会检测写入的文档是否包含_id 字段,如果没有就生成一个。

二、Windows安装MongoDB与配置

安装

  • MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,直接官网下载

  • 安装过程

    • 1、安装到该步骤时的,Custom 是指可以到你想安装的D盘或其他盘中;

    • 2、该步骤直接默认是 'Run service as Network Service user’即可;
      image

    • 3、 这里一定要取消勾选 ,先不安装图形化工具MongoDB compass,否则时间非常非常长,后续可以在官网下载
      image

    • 4、安装完成
      image

    • 5、安装完成后的文件情况:
      image

配置环境变量及数据库文件存放路径

  • 配置环境变量:将bin目录文件路径添加到环境变量
    image

  • 创建数据库文件的存放位置:在data的目录下,创建一个db文件,类似于:D:\tools\MongoDB\data\db,启动 MongoDB 服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功;
    image

启动 MongoDB 服务验证安装配置

  • 启动服务:需要使用mongod命令并指定数据库文件路径启动服务;

  • 浏览器访问验证:浏览器输入本地的MongoDB服务的ip和端口进行访问,在日志中可以找到相应段扩27017;

配置本地 Windows MongoGB 服务

这样可设置为开机自启动,可通过命令行net start MongoDB 启动或者net stop MongoDB关闭,启动的时候不需要指定db的路径;

  • 1、在 data 文件下创建新文件夹log; (用来存放日志文件)
    image

  • 2、在 MongoGB 中新建配置文件 mongo.config; (与 bin 目录同级)
    image

  • 3、用记事本打开 mongo.config 文件,并输入下面两个命令,然后保存
    (注意:以自己的实际安装的文件地址为准)

dppath=D:\tools\MongoDB\data\db
logpath=D:\tools\MongoDB\data\log\mongo.log

image

  • 4、以管理员身份打开cmd运行如下命令指定db和log路径,并设置MongoDB服务名
    • 命令:(注意:以自己的实际安装的文件地址为准)
mongod -dbpath "D:\tools\MongoDB\data\db" -logpath "D:\tools\MongoDB\data\log\mongo.log" -install -serviceName "MongoDB"

image

三、 MongoShell

1、什么是 MongoShell

MongoShell是一个互动的JavaScript接口,可以使用MongoShell来查询和更新数据以及执行管理操作。

MongoShell是MongoDB发行版的一个组件, 安装并启动MongoDB后,将MongoShell连接到正在运行的MongoDB实例,MongoDB手册中的大多数示例使用 MongoShell,然而,许多驱动程序也提供了与MongoDB类似的接口。

2、 安装Mongoshell

  • 说明: MongoDB6之前shell是直接在里面的6之后需要单独下载

下载安装步骤:

  • 1、 下载MongoDB Shell

  • 2、下载后解压,直接把这个解压后的文件复制到MongoDB安装目录下(和bin目录同级)
    image

  • 3、将该文件bin目录配置到系统变量的path变量中
    image

  • 4、在cmd输入mongosh,即可启动MongoDB Shell(前提条件是MongoDB服务是开启的)

  • 说明: 从MongoDB 5.0版本开始,mongo命令被mongosh命令取代

3、MongoDB Shell启动命令

  • 启动 MongoShell,在启动MongoShell之前请确保MongoDB 实例在运行;

    • 命令:mongosh --username <user> --password <pass> --host <host> --port 端口
    • 简写命令:mongo -u <user> -p <pass> --host <host> --port 28015
    • 说明:当没有任何参数运行mongo时,mongo shell将尝试连接到端口27017上的localhost接口上运行的MongoDB实例。
  • MongoShell 启动时可以使用一些选项:

选项 说明
–help 显示命令行选项
–nodb 启动MongoShell而不连接到数据库
–shell 与 js 文件一起使用
  • .mongorc.js文件 当启动的时候,mongosh检查用户HOME目录下的一个JavaScript文件.mongorc.js ,如果找到mongo在首次显示提示信息前解析.mongorc.js的内容。如果你使用shell执行一个JavaScript文件或计算表达式,要么通过在命令行使用--eval选项或者指定一个.js文件给mongo,mongo会在完成JavaScript的处理后读取.mongorc.js文件。你可以使用--norc选项来阻止加载.mongorc.js。
    • --eval:shell执行一个JavaScript文件或计算表达式;
    • --norc:阻止加载.mongorc.js。

4、系统基本命令

命令 说明
help 查看帮助
db.help() 查看数据库的操作帮助
db…help() 显示集合的操作文档(集合可以是不存在的)
show dbs 显示当前服务器上所有数据库的列表
use 切换数据库到 (数据库可以是不存在的)
show collections 显示当前数据库的所有集合的列表
show users 显示当前数据库的用户列表
show roles 显示用于当前数据库的用户定义和内置的所有角色的列表。
show profile 显示最近的五个操作命令
show databases 显示所有可用数据库列表。
load() 加载执行JavaScript脚本文件

交互式 shell 和mongo 脚本的区别

  1. 要使用db全局变量,请使用getDB()方法或connect()方法。可以将数据库引用分配给非db以外的变量。
  2. 默认情况下,在mongo shell中的写入操作使用写入的{w:1}。如果执行批量操作,请使用Bulk()方法。
  3. 不能在JavaScript文件中使用任何shell 指令,因为它们不是有效的JavaScript,下文附对照表。
  4. 交互模式下,mongo打印包含所有游标内容的操作结果。在脚本中,可以使用JavaScript的 print()函数或返回格式化的JSON的mongo specific printjson()函数。

下表将最常见的mongo shell助手映射到JavaScript等效项:

Shell 指令 JavaScript 操作方式
show dbs , show databases db.adminCommand(‘listDatabases’)
use db = db.getSiblingDB(‘’)
show collections db.getCollectionNames()
show users db.getUsers()
show roles db.getRoles({showBuiltinRoles: true})
show log db.adminCommand({ ‘getLog’ : ‘’ })
show logs db.adminCommand({ ‘getLog’ : ‘*’ })
it cursor = db.collection.find()if ( cursor.hasNext() )

–evel选项

  • 使用--eval选项来将mongo实例传递给一个JavaScript代码片段。
mongosh mydb --eval "printjson(db.getCollectionNames())"

执行 JavaScript 文件

  • 直接指定js文件:MongoShell 可以 指定一个 .js 文件, mongo 将会直接运行JavaScript。
# test:数据库名称
mongosh localhost:27017/test myjsfile.js
  • 使用load(js文件)函数
    • load() 方法可接受相对路径和绝对路径。如果 mongoshell 当前的工作目录位于 /data/db , 而文件demo.js 位于 /data/db/scripts 目录,那么下面两种在 mongo中的调用将会是同样的效果。
load("scripts/myjstest.js")
load("/data/db/scripts/demo.js")

5、数据库操作及crud命令

操作 语法 参数 说明
创建/切换数据库 use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库。新建的数据库没有数据,用show dbs查看不了,需要有数据才能查看;
查看当前数据库名 db
删除数据库 db.dropDatabase(dbname) dbname不传则删除当前数据库,传了则删除指定数据库
创建集合 db.createCollection(name, options) name: 要创建的集合名称; options: 可选参数, 指定有关内存大小及索引的选项 在 MongoDB 中,你不需要创建集合。当插入一些文档时,MongoDB 会自动创建集合。
删除集合 db.集合名.drop() 如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。

(1)插入文档

  • 基本插入: 若插入的数据主键已经存在,则会抛org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
db.COLLECTION_NAME.insert(document)

案例:

db.mydb1.insert({
  "title": "MongoDB使用",
  "describe": "插入document",
  "tags": ['mongodb','database','nosql']
})
  • 插入一条文档:
db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)
参数说明: document要写入的文档。

  • 插入多条:
db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

参数说明:

document:要写入的文档。
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
ordered:指定是否按顺序写入,默认 true,按顺序写入。

(2)查询文档

  • 普通显示:
db.COLLECTION_NAME.find(query, projection)

参数说明:
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
  • 格式化显示:
db.COLLECTION_NAME.find(query, projection).pretty()

(3)更新文档

  • update()方法 更新已存在的文档
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。

  • save()方法 通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。
db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

参数说明:
document : 文档数据。
writeConcern :可选,抛出异常的级别。

image

(4)删除文档

db.collection.remove(
   <query>,
   <justOne>
)

参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。

image

6、条件操作符

image
1.大于(>): $gt

db.collection2.find({age : {$gt : 30}})

2.大于等于(>=): $gte

db.collection2.find({age : {$gte : 30}})

3.小于(<):$lt

db.collection2.find({age : {$lt : 20}})


4.小于等于(<=):$lte

db.collection2.find({age : {$lte : 20}})


5.$lt (<)和 $gt (>)

db.collection2.find({age : {$gt : 30, $lt : 60,}})

7、更多命令查看

四、pymongo第三方库

1、安装

pip install pymongo

2、使用步骤

  • 1、连接服务;
  • 2、选择(创建)数据库;
  • 3、选择(创建)集合;
  • 4、进行CRUD操作;

(1)连接服务

语法: pymongo.MongoClient("mongodb://username:password@host:port")

  • username:登录用户名;
  • password:登录密码;
  • host:服务ip地址;
  • port:服务端口;

方式一: 不需要用户名密码权限认证:MongoClient(mongodb://host:port)

# 无需权限认证方式
from pymongo import MongoClient
my_client = MongoClient("mongodb://127.0.0.1:27017")
# 列出当前所有的数据库
print(my_client.list_databases())# <pymongo.command_cursor.CommandCursor object at 0x00000203D14AE350>
print(my_client.list_database_names())# ['admin', 'config', 'local', 'mydb1']

方式二: 需要用户名密码权限认证:MongoClient("mongodb://username:password@host:port")

from pymongo import MongoClient
my_client = MongoClient('mongodb://kingname:12345@127.0.0.1:27019')

(2)获取数据库、集合的基本信息

场景 方法 说明
查看所有的数据库 client.list_database_names() 获取所有已存在的数据库名
查看数据库中所有集合 db.list_collection_names() 获取数据库中已存在的集合名

(3)选择(创建)数据库、选择(创建)集合

获取数据库
方法一:db = client.test
方法二:db = client['test']
指定集合
方法一:collection = db.stu
方法二:collection = db['stu']

说明:

  • MongoDB中的数据库和集合,如果不往里面添加数据是不会被真正创建的;
  • 在指定数据库或者集合的时候,如果已存在就直接使用,如果不存在会新创建;

方式一:

from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")

# 2、查看已存在的数据库
#已有数据=['admin', 'config', 'local', 'mydb1', 'test', 'test111']
print(f"已有数据={client.list_database_names()}")

# 3、新创建一个数据库
stu_db = client.student
# 查看数据库是不是被创建
# 对比数据库还有没有新增创建成功=['admin', 'config', 'local', 'mydb1', 'test', 'test111']
print(f"对比数据库还有没有新增创建成功={client.list_database_names()}")

# 4、在数据库中创建一个集合
stu_info_coll = stu_db.infomation
# 查看集合是否创建成功
# 查看集合是否创建成功=[]
print(f"查看集合是否创建成功={stu_db.list_collection_names()}")

# 5、给集合中添加数据
stu_data1 = {"name":"zhangsan","age":18,"hobby":['钓鱼','摸瞎']}
stu_info_coll.insert_one(stu_data1)

# 再次查询数据库和集合是否创建成功
# 再次查询数据库=['admin', 'config', 'local', 'mydb1', 'student', 'test', 'test111']
print(f"再次查询数据库={client.list_database_names()}")
# 再次查询集合=['infomation']
print(f"再次查询集合={stu_db.list_collection_names()}")

方式二:

from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")

# 2、查看已存在的数据库
#已有数据=['admin', 'config', 'local', 'mydb1', 'student', 'test', 'test111']
print(f"已有数据={client.list_database_names()}")

# 3、新创建一个数据库
tea_db = client.teacher
# 查看数据库是不是被创建
# 对比数据库还有没有新增创建成功=['admin', 'config', 'local', 'mydb1', 'student', 'test', 'test111']
print(f"对比数据库还有没有新增创建成功={client.list_database_names()}")

# 4、在数据库中创建一个集合
stu_info_coll = tea_db.infomation
# 查看集合是否创建成功
# 查看集合是否创建成功=[]
print(f"查看集合是否创建成功={tea_db.list_collection_names()}")

# 5、给集合中添加数据
tea_data1 = {"name":"王老师","age":18,"hobby":['钓鱼','摸瞎']}
stu_info_coll.insert_one(tea_data1)

# 再次查询数据库和集合是否创建成功
# 再次查询数据库=['admin', 'config', 'local', 'mydb1', 'student', 'teacher', 'test', 'test111']
print(f"再次查询数据库={client.list_database_names()}")
# 再次查询集合=['infomation']
print(f"再次查询集合={tea_db.list_collection_names()}")

(4)查询数据库

A、 find(查询条件,返回字段),返回查找满足条件的全部数据

B、 find_one(查询条件,返回字段),返回满足条件的第一天数据

  • 参数1: 字典类型的条件,需要指定key和value;

    • 不传:不给该参数查询所有;
  • 参数2: {}花括号包裹的,可以只有key,也可以是键值对,为键值对的时候value是0/1;

    • 0:表示不返回这个字段;其中_id比较特殊,必须人工指定它的值为0,这样才不会返回;
    • 1:表示返回这个字段–默认值,所以才可以只给键,默认返回这个键对应的键值对;**
    • 不传:不给该参数返回所有字段;
  • 说明
    1、如果不输入第一个参数也就是查询条件,只输入返回字段,那查询条件也需要传入空{}花括号;
    2、返回字段,如果设置了多个字段,那这多个字段的返回状态0/1必须一致,也就是要么都返回要么都不返回,如果有点返回有点不返回会报错;

from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 4、查询所有数据
result = teacher_info_coll.find()
print(f"查询所有数据={result}")
temp = 0
for r in result:
    temp +=1
    print(f"所有数据中的第{temp}条是={r}")

# 查询给定条件所有数据
result_18 = teacher_info_coll.find({"age":18})
print(f"查询指定条件所有数据={result_18}")
temp = 0
for r in result_18:
    temp +=1
    print(f"指定条件的第{temp}条是={r}")

# 5、查询一条数据,不给条件就是第一条,不返回age和hobby字段
result_one = teacher_info_coll.find_one({},{'age':0,'hobby':0})
print(f"不给条件默认查询第一条={result_one}")

# 给定条件查询一条--满足条件的第一条,返回age和hobby字段
result_one_condition = teacher_info_coll.find_one({"age":18},{'age','hobby'})
print(f"给定条件查询一条={result_one_condition}")
-------------------------------------------------------------------------------------------------------------
['admin', 'config', 'local', 'mydb1', 'student', 'teacher', 'test', 'test111']
['infomation']
查询所有数据=<pymongo.cursor.Cursor object at 0x0000023CEB12F910>
所有数据中的第1条是={'_id': ObjectId('653a1cf922f024932286464d'), 'name': '王老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
所有数据中的第2条是={'_id': ObjectId('653a207902c6fd27dfee8268'), 'name': '张老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
所有数据中的第3条是={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38, 'hobby': ['钓鱼', '摸瞎']}
所有数据中的第4条是={'_id': ObjectId('653a207902c6fd27dfee826a'), 'name': '赵老师', 'age': 48, 'hobby': ['钓鱼', '摸瞎']}
查询指定条件所有数据=<pymongo.cursor.Cursor object at 0x0000023CED136DD0>
指定条件的第1条是={'_id': ObjectId('653a1cf922f024932286464d'), 'name': '王老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
指定条件的第2条是={'_id': ObjectId('653a207902c6fd27dfee8268'), 'name': '张老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
不给条件默认查询第一条={'_id': ObjectId('653a1cf922f024932286464d'), 'name': '王老师'}
给定条件查询一条={'_id': ObjectId('653a1cf922f024932286464d'), 'age': 18, 'hobby': ['钓鱼', '摸瞎']}

C、条件查询

比较运算符:

正则表达式:
image

其他条件规则补充:

  • $or 、$and - 逻辑与/非
  • “$in” - 判断键值是否为null
  • “$all” - 数组精确匹配
  • $in 、$nin - [匹配键值等于、匹配键不等于或者不存在]指定数组中任意值的文档
  • “$and” - 选择出满足该数组中所有表达式的文档
  • “$nor” - 选择出都不满足该数组中所有表达式的文档
  • “$not” - 选择出不能匹配表达式的文档
  • “$or” - 选择出至少满足数组中一条表达式的文档

语法格式: find({'字段(列名)': {'条件运算符':值, '调减运算符':值,,,}})

from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 定义一个打印方法
def my_print(info,result):
    for r in result:
        print(f"{info}={r}")

# 大于 $gt--大于18岁
result = teacher_info_coll.find({'age':{'$gt':18}},{'name','age'})
my_print('大于 $gt--大于18岁',result)

# 小于 $lt--小于48岁
result = teacher_info_coll.find({'age':{'$lt':48}})
my_print('小于 $lt--小于48岁',result)

# 两个条件,大于18,小于48
result = teacher_info_coll.find({'age':{'$gt':18,'$lt':48}})
my_print('两个条件,大于18,小于48',result)

# 大于等于 $gte--大于等于18岁
result = teacher_info_coll.find({'age':{'$gte':18}})
my_print('大于等于 $gte--大于等于18岁',result)

# 小于等于 $lte--小于等于38岁
result = teacher_info_coll.find({'age':{'$lte':38}})
my_print('小于等于 $lte--小于等于38岁',result)

# 等于 $eq 或者不用比较运算符,直接传key-value就是等于--等于38岁
result = teacher_info_coll.find({'age':{'$eq':38}},{'name','age'})
my_print('等于 $eq 或者不用比较运算符,直接传key-value就是等于--等于38岁',result)

# 等于用key-value
result = teacher_info_coll.find({'age':38},{'name','age'})
my_print('等于用key-value',result)

# 不等于 $ne--不等于38岁
result = teacher_info_coll.find({'age':{'$ne':38}})
my_print('不等于 $ne--不等于38岁',result)
------------------------------------------------------------------------------------
['admin', 'config', 'local', 'mydb1', 'student', 'teacher', 'test', 'test111']
['infomation']
大于 $gt--大于18岁={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38}
大于 $gt--大于18岁={'_id': ObjectId('653a207902c6fd27dfee826a'), 'name': '赵老师', 'age': 48}
小于 $lt--小于48岁={'_id': ObjectId('653a1cf922f024932286464d'), 'name': '王老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
小于 $lt--小于48岁={'_id': ObjectId('653a207902c6fd27dfee8268'), 'name': '张老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
小于 $lt--小于48岁={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38, 'hobby': ['钓鱼', '摸瞎']}
两个条件,大于18,小于48={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38, 'hobby': ['钓鱼', '摸瞎']}
大于等于 $gte--大于等于18岁={'_id': ObjectId('653a1cf922f024932286464d'), 'name': '王老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
大于等于 $gte--大于等于18岁={'_id': ObjectId('653a207902c6fd27dfee8268'), 'name': '张老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
大于等于 $gte--大于等于18岁={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38, 'hobby': ['钓鱼', '摸瞎']}
大于等于 $gte--大于等于18岁={'_id': ObjectId('653a207902c6fd27dfee826a'), 'name': '赵老师', 'age': 48, 'hobby': ['钓鱼', '摸瞎']}
小于等于 $lte--小于等于38岁={'_id': ObjectId('653a1cf922f024932286464d'), 'name': '王老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
小于等于 $lte--小于等于38岁={'_id': ObjectId('653a207902c6fd27dfee8268'), 'name': '张老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
小于等于 $lte--小于等于38岁={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38, 'hobby': ['钓鱼', '摸瞎']}
等于 $eq 或者不用比较运算符,直接传key-value就是等于--等于38岁={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38}
等于用key-value={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38}
不等于 $ne--不等于38岁={'_id': ObjectId('653a1cf922f024932286464d'), 'name': '王老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
不等于 $ne--不等于38岁={'_id': ObjectId('653a207902c6fd27dfee8268'), 'name': '张老师', 'age': 18, 'hobby': ['钓鱼', '摸瞎']}
不等于 $ne--不等于38岁={'_id': ObjectId('653a207902c6fd27dfee826a'), 'name': '赵老师', 'age': 48, 'hobby': ['钓鱼', '摸瞎']}

D、find().sort(’列名’, 1或-1),对查询结果排序

参数说明:

  • 列名:按照列名进行排序;
  • 1:升序;
  • -1:降序
from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 定义一个打印方法
def my_print(info,result):
    for r in result:
        print(f"{info}={r}")

# 查询age,20-40岁,显示age和name,按照age升序排列
result = teacher_info_coll.find({'age':{'$gt':20,'$lt':40}},{'name','age'}).sort('age',1)
my_print('查询age,20-40岁,显示age和name,按照age升序排列',result)
# 按照age降序排列
result = teacher_info_coll.find({'age':{'$gt':20,'$lt':40}},{'name','age'}).sort('age',-1)
my_print('查询age,20-40岁,显示age和name,按照age降序排列',result)
--------------------------------------------------------------------------------------------------------
['admin', 'config', 'local', 'mydb1', 'student', 'teacher', 'test', 'test111']
['infomation']
查询age,20-40岁,显示age和name,按照age升序排列={'_id': ObjectId('653a2f99a2fec33a1b441a5d'), 'name': '美女老师', 'age': 25}
查询age,20-40岁,显示age和name,按照age升序排列={'_id': ObjectId('653a2f99a2fec33a1b441a5b'), 'name': '小老师', 'age': 35}
查询age,20-40岁,显示age和name,按照age升序排列={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38}
查询age,20-40岁,显示age和name,按照age降序排列={'_id': ObjectId('653a207902c6fd27dfee8269'), 'name': '李老师', 'age': 38}
查询age,20-40岁,显示age和name,按照age降序排列={'_id': ObjectId('653a2f99a2fec33a1b441a5b'), 'name': '小老师', 'age': 35}
查询age,20-40岁,显示age和name,按照age降序排列={'_id': ObjectId('653a2f99a2fec33a1b441a5d'), 'name': '美女老师', 'age': 25}

E、查看集合中某条件文档的数量

  • 1、使用collection.count_documents(filter: Mapping[str, Any])方法根据条件统计;
  • 2、通过find方法查出之后,先强转为list,再用len()方法获取数量;
from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 获取集合中age=18的数量-方式一:使用collection.count_documents(filter: Mapping[str, Any])
print(f"age=18的文档数量,方式一:{teacher_info_coll.count_documents({'age':18})}")

# 方式二:通过find方法查出之后,先强转为list,再用len()方法获取数量
result = teacher_info_coll.find({'age':18})
print(f"age=18的文档数量,方式二:{len(list(result))}")

# 统计集合中所有文档的数量
result = teacher_info_coll.find()
print(f"集合中所有文档的数量:{len(list(result))}")

F、查询结果去重 collection.distinct()

  • 语法:distinct(key, filter = None, session = None, **kwargs)
  • 参数说明:
    • key: 需要为其找到不同值的字段名称。
    • filter:(可选)查询条件,指定从中检索不同值的文档。
    • session:(可选)一个 ClientSession。
  • 返回:返回单个集合中指定字段的不同值并以数组形式返回结果的函数;
from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 查询集合中age构成(重复的不要)
result = teacher_info_coll.distinct("age")
print(result)

# 查询集合中age=18不重复的名字
result = teacher_info_coll.distinct('name',{"age":18})
print(result)

G、分页查询

1、cursor.limit(limit: int) 指定查询多少条;
2、cursor.skip(skip: int) 跳过多少条,相当于游标往后移动了多少位置;

import pymongo
from pymongo import MongoClient
from pymongo.collection import Collection

# 使用limit和skip封装一个分页查询方法
def page_query(collection: Collection,filter=None,content_size=5,page_number=1) -> pymongo.cursor.Cursor: 
    """
    查询第几页数据,每一页数据多少条
    :param collection: 集合名称
    :param filter: 过滤条件
    :param content_size: 每页数据条数--默认5条
    :param page_number: 页数--默认第一页
    :return: 第几页的查询结果
    """
    skip = content_size*(page_number -1)
    # limit(limit)指定查询多少条
    # skip(skip)跳过多少条才开始查,相当于异动游标
    result = collection.find(filter).limit(content_size).skip(skip)
    return result

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 每页查询7条,获取第2页的数据--第8条到第14条
result = page_query(collection=teacher_info_coll,content_size=7,page_number=2)
print(type(result))# <class 'pymongo.cursor.Cursor'>
for r in result:
    print(r)

(5))插入数据

A、插入单条:collection.insert_one(单条数据)

B、插入多条:collection.insert_many(多条数据)

参数说明:

  • 可以是一个list类型的数据;
  • 可以是多个单数据通过[数据1,数据2,,]传递;
from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 定义一个打印方法
def my_print(info,result):
    for r in result:
        print(f"{info}={r}")

# 插入单条
tea_data1 = {"name":"tea_data1","age":18,"hobby":['钓鱼','摸瞎']}
result = teacher_info_coll.insert_one(tea_data1)
print(result)# <pymongo.results.InsertOneResult object at 0x0000019E79B1A9E0>

# 插入多条--方式一:通过[]传递
tea_data2 = {"name":"tea_data2","age":18,"hobby":['钓鱼','摸瞎']}
tea_data3 = {"name":"tea_data3","age":18,"hobby":['钓鱼','摸瞎']}
tea_data4 = {"name":"tea_data4","age":18,"hobby":['钓鱼','摸瞎']}
teacher_info_coll.insert_many([tea_data2,tea_data3,tea_data4])

# 方式二:本身就是list类型数据
tea_data_many = [
    {"name":"tea_data_many1","age":18,"hobby":['钓鱼','摸瞎']},
    {"name":"tea_data_many2","age":18,"hobby":['钓鱼','摸瞎']},
    {"name":"tea_data_many3","age":18,"hobby":['钓鱼','摸瞎']}
]
# teacher_info_coll.insert_one(tea_data_many)# 报错
teacher_info_coll.insert_many(tea_data_many)

# 查看插入情况
result = teacher_info_coll.find()
my_print('所有数据:',result)

C、批量写入 bulk_write(requests, ordered=True, bypass_document_validation=False, session=None)

  • 参数说明:
    • requests:一个包含写操作示例的列表(InsertOne, UpdateOne, UpdateMany, ReplaceOne, DeleteOne, or DeleteMany);
    • ordered:表示是否顺序写入,设为True时其中的操作顺序执行,中间出错则后续操作都不会执行;设为False则所有的操作乱序执行,其中一个操作出错其余的操作不会受影响;
from pymongo import MongoClient, InsertOne, UpdateOne, UpdateMany, ReplaceOne, DeleteOne

# 连接服务
client = MongoClient("mongodb://127.0.0.1:27017")

# 新建一个数据库
write_db = client.write

# 新建一个集合
write_data_coll = write_db.data

# 给集合插入数据让集合和数据库真正创建
data = {'c':3}
write_data_coll.insert_one(data)
print(list(write_data_coll.find()))
# 使用bulk_write-插入一个-----→更新一个------→替换一个---------→删除一个
# -------------InsertOne----→UpdateOne----→ReplaceOne------→DeleteOne
# 操作前查询一次
print(f"before:{list(write_data_coll.find())}")
# 新插入一个
insertone = InsertOne({'插入一个':2})
# 把{'a':1}更新为{'a被更新一个':3}
updateone = UpdateOne({'a':1},{'$set':{'a被更新一个':3}})
# 把{'aa':11 }替换为{'aa被替换':110011}
replaceone = ReplaceOne({'aa':11 },{'aa被替换':110011})
# 删掉{'c':3}
deleteone = DeleteOne({'c':3})
requests = [insertone,updateone,replaceone,deleteone]
# 按顺序操作
result = write_data_coll.bulk_write(requests,ordered=True)

# # 操作后查询一次
print(f"after:{list(write_data_coll.find())}")
-----------------------------------------------------------------------------------------
[{'_id': ObjectId('653a70447891cb3904723a50'), 'a': 1}, {'_id': ObjectId('653a7244c0e42399767a8c9e'), 'aa': 11}, {'_id': ObjectId('653a726867d2fbb987207607'), 'aaa': 111}, {'_id': ObjectId('653a727ad7c2755eb5ee1ed7'), 'b': 2}, {'_id': ObjectId('653a728330b1bcbc93a62f27'), 'bb': 22}, {'_id': ObjectId('653a728840a4a07b1b2b2172'), 'c': 3}, {'_id': ObjectId('653a74a346cb9cfd21e38485'), 'c': 3}]
before:[{'_id': ObjectId('653a70447891cb3904723a50'), 'a': 1}, {'_id': ObjectId('653a7244c0e42399767a8c9e'), 'aa': 11}, {'_id': ObjectId('653a726867d2fbb987207607'), 'aaa': 111}, {'_id': ObjectId('653a727ad7c2755eb5ee1ed7'), 'b': 2}, {'_id': ObjectId('653a728330b1bcbc93a62f27'), 'bb': 22}, {'_id': ObjectId('653a728840a4a07b1b2b2172'), 'c': 3}, {'_id': ObjectId('653a74a346cb9cfd21e38485'), 'c': 3}]
after:[{'_id': ObjectId('653a70447891cb3904723a50'), 'a': 1, 'a被更新一个': 3}, {'_id': ObjectId('653a7244c0e42399767a8c9e'), 'aa被替换': 110011}, {'_id': ObjectId('653a726867d2fbb987207607'), 'aaa': 111}, {'_id': ObjectId('653a727ad7c2755eb5ee1ed7'), 'b': 2}, {'_id': ObjectId('653a728330b1bcbc93a62f27'), 'bb': 22}, {'_id': ObjectId('653a74a346cb9cfd21e38485'), 'c': 3}, {'_id': ObjectId('653a74a346cb9cfd21e38486'), '插入一个': 2}]

(6)更新数据

A、collection.replace_one(filter, replacement, upsert=False) 对指定文档中的所有字段都进行修改而不只是某些字段

  • 参数说明:
    • filter:(必选参数) 是一个用于选择要修改的文档的查询条件,它可以是一个字典或者一个 MongoDB 查询对象。
    • replacement:(必选参数)是对原始文档完全替换的新文档,请注意,替换文档中应包含该文档的所有字段,并将从原始文档检索和保留_id字段。
    • upsert:(可选参数)是一个布尔值,在默认情况下为 False ,表示不存在符合filter 条件的文档就不做修改,如果设置成 True ,则在不存在符合条件的文档时插入新的文档。
from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 将集合中name='美女老师'的整个文档内容进行替换
filter = {'name':'美女老师'}
new_teacher = {'name':'超级大美女','age':20,'hobby':['化妆','照镜子']}
teacher_info_coll.replace_one(filter,new_teacher)

# 查看是否替换成功
result = teacher_info_coll.find_one({'name':'超级大美女'})
# 替换后的数据为={'_id': ObjectId('653a2f99a2fec33a1b441a5d'), 'name': '超级大美女', 'age': 20, 'hobby': ['化妆', '照镜子']}
print(f"替换后的数据为={result}")

B、collection.find_one_and_replace(filter,replacement)查找符合条件的一个并进行全部替换

  • 返回值:如果替换成功就返回源数据,否则返货None;
# 将name='美女老师'的整个内容进行替换
filter = {'name':'超级大美女'}
hobby = {'hobby':['摔跤','跆拳道']}
resul = teacher_info_coll.find_one_and_replace(filter,hobby)
print(f"find_one_and_replace返回结果={resul}")

# 查看替换结果
result = teacher_info_coll.find_one({'hobby':['摔跤','跆拳道']})
# 替换后的数据为={'_id': ObjectId('653a2f99a2fec33a1b441a5d'), 'hobby': ['摔跤', '跆拳道']}
print(f"替换后的数据为={result}")

C、collection.update_one(filter,replacement)符合条件的部分替换

  • 注意:raise ValueError("update only works with $ operators")–replacement必须通过修改操作符进行设置;
  • 完整参数说明:
    • **‘filter’:**与要更新的文档匹配的查询。
    • ‘new_values’:适用的修改。
    • **‘upsert’(可选):**如果是 “True”,则在没有文档与过滤器匹配时执行插入。
    • **‘bypass_document_validation’(可选):**如果是 “True”,则允许写入文档级验证的 opt-out。默认值为 “False”。
    • **‘collation’(可选):**类的实例:‘~pymongo.collat​​ion.Collat​​ion’。此选项仅在 MongoDB 3.4 及更高版本上受支持。
    • **‘array_filters’(可选):**指定更新应应用哪些数组元素的过滤器列表。需要 MongoDB 3.6+。
    • **‘session’(可选):**一个类:‘~pymongo.client_session.ClientSession’。
# 将name='小老师'的hobby字段进行修改
filter = {'name': {'$regex':'^小.*'}}# name以小开头
hobby = {'$set':{'hobby':['摔跤','跆拳道']}}
result = teacher_info_coll.update_one(filter,hobby)
print(result)# <pymongo.results.UpdateResult object at 0x000002EE9CA9A500>

result = teacher_info_coll.find_one(filter)
# {'_id': ObjectId('653a2f99a2fec33a1b441a5b'), 'name': '小老师', 'age': 35, 'hobby': ['摔跤', '跆拳道']}
print(result)

D、collection.update_many(filter,replacement)对多条符合条件的数据进行部分替换

  • 注意:replacement必须通过修改操作符进行设置;
# 将集合中name以tea开头的数据name全部替换
filter = {'name':{'$regex':'^tea'}}
new_name = {'$set':{'name':'update_many'}}
result = teacher_info_coll.update_many(filter,new_name)
# <pymongo.results.UpdateResult object at 0x000002274862A500>
print(result)

# 查看替换结果
result = teacher_info_coll.find({'name':'update_many'})
for r in result:
    print(r)

(7)删除

A、collection.drop() 删除collection

from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())# ['infomation']

# 3、创建一个新集合
teacher_address_coll = teacher_db.address

# 给集合插入数据
data1 = {"name":"张三","address":"北京"}
teacher_address_coll.insert_one(data1)
# 查看所有集合
print(teacher_db.list_collection_names())# ['address', 'infomation']

# 删除集合,之后再查看
teacher_address_coll.drop()
print(teacher_db.list_collection_names())# ['infomation']

B、collection.delete_one(filter) 删除符合条件的第一条

  • 返回值: 成功删除:DeleteResult对象,里面有个属性``可以获取成功过删除的条数;

在此处键入或粘贴代码

from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 删除一天age=40的文档
filter = {'age':40}
# 删除之前查一遍
# {'_id': ObjectId('653a2f99a2fec33a1b441a5c'), 'name': '大老师', 'age': 40, 'hobby': ['钓鱼', '摸瞎']}
print(teacher_info_coll.find_one(filter))
result = teacher_info_coll.delete_one(filter)
# 查看删除后返回值
print(result)# <pymongo.results.DeleteResult object at 0x0000017FC9BBA470>
# 查看删除的数量
print(result.deleted_count)# 1
# 查看是否成功删除
print(teacher_info_coll.find_one(filter))# None

C、collection.delete_many(filter) 删除符合条件的所有

from pymongo import MongoClient

# 1、连接服务
client = MongoClient("mongodb://127.0.0.1:27017")
# 查看已有数据库
print(client.list_database_names())

# 2、选择数据库
teacher_db = client.teacher
# 查看所有集合
print(teacher_db.list_collection_names())

# 3、选择集合
teacher_info_coll = teacher_db.infomation

# 删除name以王开头的所有数据
filter = {'name':{'$regex':'^王'}}
result = teacher_info_coll.delete_many(filter)
print(f"一共删除了{result.deleted_count}数据")# 一共删除了3天数据

3、修改操作符

(1)$inc

用法: {$inc:{field:value}}
❖ 作用:对一个数字字段的某个 field 增加 value
❖ 示例:将 name 为 xiaohong 的学生的 age 增加 5
❖ db.students.update({name:“xiaohong”},{$inc:{age:5}})

(2)$set

用法: {$set:{field:value}}
❖ 作用:把文档中某个字段 field 的值设为 value
❖ 示例: 把 xiaohong 的年龄设为 10 岁
❖ db.students.update({name:“xiaohong”},{$set:{age:10}})

(4)$unset

用法: {$unset:{field:1}}
❖ 作用:删除某个字段 field
❖ 示例: 将 chenzhou 的年龄字段删除
❖ db.students.update({name:“chenzhou”},{$unset:{age:1}})

(5)$push

用法: {$push:{field:value}}
❖ 作用:把 value 追加到 field 里。注: field 只能是数组类型,如果 field 不存
在,会自动插入一个数组类型
❖ 示例:给 chenzhou 添加别名 “michael”
❖ db.students.update({name:“chenzhou”},{$push:{“ailas”:“Michael”}})

(6)$rename

用法: {$rename:{old_field_name:new_field_name}}
❖ 作用:对字段进行重命名
❖ 示例:把 xiaohong 记录的 name 字段重命名为 hello
❖ db.students.update({name:“xiaohong”},{$rename:{“name”:“name2”}})