一、MongoDB介绍
- 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数据基本模型(与关系型数据库进行类比理解)
整体框架类比
- database 数据库,与SQL的数据库(database)概念相同,一个数据库包含多个集合(表)
- collection 集合,相当于SQL中的表(table),一个集合可以存放多个文档(行)。 不同之处就在于集合的结构(schema)是动态的,不需要预先声明一个严格的表结构。更重要的是,默认情况下 MongoDB 并不会对写入的数据做任何schema的校验。
- document 文档,相当于SQL中的行(row),一个文档由多个字段(列)组成,并采用bson(json)格式表示。
- field 字段,相当于SQL中的列(column),相比普通column的差别在于field的类型可以更加灵活,比如支持嵌套的文档、数组。
- 此外,MongoDB中字段的类型是固定的、区分大小写、并且文档中的字段也是有序的。
关键字类比
- _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 计数器(初始化随机)
-
_id 的生成实质上是由客户端(Driver)生成的,这样可以获得更好的随机性,同时降低服务端的负载。当然服务端也会检测写入的文档是否包含_id 字段,如果没有就生成一个。
二、Windows安装MongoDB与配置
安装
-
MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,直接官网下载。
-
安装过程:
-
1、安装到该步骤时的,Custom 是指可以到你想安装的D盘或其他盘中;
-
2、该步骤直接默认是 'Run service as Network Service user’即可;
-
3、 这里一定要取消勾选 ,先不安装图形化工具
MongoDB compass
,否则时间非常非常长,后续可以在官网下载;
-
4、安装完成
-
5、安装完成后的文件情况:
-
配置环境变量及数据库文件存放路径
-
配置环境变量:将bin目录文件路径添加到环境变量
-
创建数据库文件的存放位置:在data的目录下,创建一个db文件,类似于:
D:\tools\MongoDB\data\db
,启动 MongoDB 服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功;
启动 MongoDB 服务验证安装配置
-
启动服务:需要使用
mongod
命令并指定数据库文件路径启动服务;- 命令:
mongod --dbpath D:\tools\MongoDB\data\db
- 命令:
-
浏览器访问验证:浏览器输入本地的MongoDB服务的ip和端口进行访问,在日志中可以找到相应段扩27017;
- 地址:
http://localhost:27017
- 地址:
配置本地 Windows MongoGB 服务
这样可设置为开机自启动,可通过命令行net start MongoDB
启动或者net stop MongoDB
关闭,启动的时候不需要指定db的路径;
-
1、在 data 文件下创建新文件夹log; (用来存放日志文件)
-
2、在 MongoGB 中新建配置文件 mongo.config; (与 bin 目录同级)
-
3、用记事本打开 mongo.config 文件,并输入下面两个命令,然后保存 ;
(注意:以自己的实际安装的文件地址为准)
dppath=D:\tools\MongoDB\data\db
logpath=D:\tools\MongoDB\data\log\mongo.log
-
4、以管理员身份打开cmd运行如下命令指定db和log路径,并设置MongoDB服务名
- 命令:(注意:以自己的实际安装的文件地址为准)
mongod -dbpath "D:\tools\MongoDB\data\db" -logpath "D:\tools\MongoDB\data\log\mongo.log" -install -serviceName "MongoDB"
-
5、使用命令开启关闭服务验证配置
- 开启服务:
net start MongoDB
–后台运行 - 关闭服务:
net stop MongoDB
- Windows查看启动的服务:win+R输入
services.msc
- 开启服务:
三、 MongoShell
1、什么是 MongoShell
MongoShell是一个互动的JavaScript接口,可以使用MongoShell来查询和更新数据以及执行管理操作。
MongoShell是MongoDB发行版的一个组件, 安装并启动MongoDB后,将MongoShell连接到正在运行的MongoDB实例,MongoDB手册中的大多数示例使用 MongoShell,然而,许多驱动程序也提供了与MongoDB类似的接口。
2、 安装Mongoshell
- 说明: MongoDB6之前shell是直接在里面的6之后需要单独下载;
下载安装步骤:
-
2、下载后解压,直接把这个解压后的文件复制到MongoDB安装目录下(和bin目录同级)
-
3、将该文件bin目录配置到系统变量的path变量中
-
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 脚本的区别
- 要使用db全局变量,请使用getDB()方法或connect()方法。可以将数据库引用分配给非db以外的变量。
- 默认情况下,在mongo shell中的写入操作使用写入的{w:1}。如果执行批量操作,请使用Bulk()方法。
- 不能在JavaScript文件中使用任何shell 指令,因为它们不是有效的JavaScript,下文附对照表。
- 交互模式下,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 :可选,抛出异常的级别。
(4)删除文档
db.collection.remove(
<query>,
<justOne>
)
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
6、条件操作符
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、条件查询
比较运算符:
正则表达式:
其他条件规则补充:
- $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.collation.Collation’。此选项仅在 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”}})