Task02:数据库的基本使用(MongoDB)
- 1. 安装
- 2. 简介
- 3. 特点
- 4. 概念
- 5. 数据库的基本操作
- 5.1 新建
- 5.2 删除
- 5.3 查看
- 6.集合(表)的基本操作
- 6.1 新建
- 6.2 删除
- 6.3 查看
- 7. 文档(行,记录)的基本操作
- 7.1 新建
- 7.2 删除
- 7.3 更新[^1]
- 7.4 查询
- 7.4.1 全体查询
- 7.4.2 `AND`查询
- 7.4.3 `OR`查询
- 7.4.4 联用`AND`和`OR`
- 7.4.5 排序
- 8.`pyMongo`
- 8.1 数据库
- 8.1.1 连接数据库
- 8.1.2 新建数据库
- 8.1.3 查看已有数据库
- 8.2 集合
- 8.2.1 新建集合
- 8.2.2 查看集合
- 8.2.3 删除集合
- 8.3 文档
- 8.3.1 插入单个文档
- 8.3.2 插入多个文档
- 8.3.3 查询文档
- 8.3.3.1 查询一条数据
- 8.3.3.2 查询所有数据
- 8.3.3.3 查询数据指定字段
- 8.3.3.4 查询条件数据
- 8.3.3.5 查询指定条数记录
- 8.3.4 修改文档
- 8.3.5 排序数据
- 8.3.6 删除文档
- 8.3.6.1 删除单个
- 8.3.6.2 删除所有
1. 安装
参见Task01
里面的步骤在Linux
平台上进行安装,这里不再赘述
2. 简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
3. 特点
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
- Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单
4. 概念
SQL术语/概念MongoDB术语/概念解释/说明 databasedatabase数据库 tablecollection数据库表/集合 rowdocument数据记录行/文档 columnfield数据字段/域 indexindex索引 table joins表连接,MongoDB不支持 primary keyprimary key主键,MongoDB自动将_id字段设置为主键
5. 数据库的基本操作
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
5.1 新建
语法格式为
use DATABASE_NAME
use
同样也可以用来切换数据库,或者说本身就是切换数据库的命令。只是如果当数据库不存在的时候,就新建该数据库,否则切换到该数据库。
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> use toy
switched to db toy
> db
toy
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
我们发现,虽然已经新建了数据库toy
,但是其并不在数据库列表当中。但是查询当前所在的数据库,却又显示为toy
,证明创建成功。这应该是因为数据库当中没有数据。
5.2 删除
语法如下:
db.dropDatabase()
切换到要删除的数据库,运行该命令即可
5.3 查看
db
是显示当前数据库,show dbs
是展示所有数据库
> db
toy
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
6.集合(表)的基本操作
6.1 新建
语法格式:
db.createCollection(name, options)
参数说明:
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
字段类型描述 capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 autoIndexId布尔3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。 size数值(可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。 max数值(可选)指定固定集合中包含文档的最大数量。
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> use toy
switched to db toy
> db
toy
> db.createCollection("Marvel")
{ "ok" : 1 }
> db.createCollection("Disney")
{ "ok" : 1 }
> show tables
Disney
Marvel
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
toy 0.000GB
>
6.2 删除
语法格式:
db.collection.drop()
这里的cpllection
指的是集合的名字
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
toy 0.000GB
> db
toy
> show tables
Disney
Marvel
> db.Marvel.drop()
true
> show tables
Disney
> db
toy
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
toy 0.000GB
>
6.3 查看
语法格式:
show tables
7. 文档(行,记录)的基本操作
7.1 新建
文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
语法格式:
MongoDB 使用 insert() 或 save() 方法向集合中插入文档:db.COLLECTION_NAME.insert(document) db.COLLECTION_NAME.save(document)
- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
> show tables
Disney
> db
toy
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
toy 0.000GB
> show tables
Disney
> db.Disney.insert({name:'Mickey',type:'mouse'})
WriteResult({ "nInserted" : 1 })
> db.Disney.insert({name:'Donald',type:'duck'})
WriteResult({ "nInserted" : 1 })
> db.Disney.insert({name:'Goofy',type:'dog'})
WriteResult({ "nInserted" : 1 })
> db.Disney.insert({name:'Pluto',type:'dog'})
WriteResult({ "nInserted" : 1 })
我们可以用find
来查看集合(表)当中的文档(记录)
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
我们也可以将文档赋予变量,然后插入变量
> document = {name:'Minnie',type:'mouse'}
{ "name" : "Minnie", "type" : "mouse" }
> db.Disney.insert(document)
WriteResult({ "nInserted" : 1 })
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225f9c339108c22ab583668"), "name" : "Minnie", "type" : "mouse" }
>
7.2 删除
MongoDB remove() 函数是用来移除集合中的数据。
MongoDB 数据更新可以使用 update() 函数。在执行 remove() 函数前先执行 find() 命令来判断执行的条件是否正确,这是一个比较好的习惯。
语法
remove() 方法的基本语法格式如下所示:db.collection.remove( <query>, <justOne> )
如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
我们先执行一个重复插入数据,便于接下来演示如何删除,然后查看集合
> db.Disney.insert(document)
WriteResult({ "nInserted" : 1 })
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225f9c339108c22ab583668"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("6225fafb39108c22ab583669"), "name" : "Minnie", "type" : "mouse" }
可以看到,Minnie
出现了两次,我们尝试去删除:
> db.Disney.remove({name:'Minnie'})
WriteResult({ "nRemoved" : 2 })
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
直接删除的话,会删除全部符合条件的文档,如果只想删除找到的第一条记录:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
实例如下:
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc2239108c22ab58366b"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.remove({name:'Minnie'},1)
WriteResult({ "nRemoved" : 1 })
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
>
如果想要删除集合内所有的文档,可以使用类似常规 SQL 的 truncate 命令:
> db.col.remove({})
WriteResult({ "nRemoved" : 2 })
> db.col.find()
>
7.3 更新1
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
update() 方法
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 :可选,抛出异常的级别。
由于高飞是直立行走,所以我们也可以将其种类改为人类
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.update({name:'Goofy'},{$set:{type:'human'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "human" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
save() 方法
MongoDB 另一个更新(修改)文档的方法是 save(),save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:db.collection.save( <document>, { writeConcern: <document> } )
参数说明:
- document : 要更新的文档数据, 如果集合内部已经存在一个与document相同的“_id”的记录,Mongodb 会把集合中的对象替换为document;如果不存在,则会插入document
- writeConcern :可选,抛出异常的级别。
我们再把高飞的分类给改回去
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "human" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.save({ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
save
是直接替换样式的,会直接根据_id
替换掉整个文档,应该是多用于自建_id
吧
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.save({ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
>
7.4 查询
7.4.1 全体查询
MongoDB 查询文档使用 find() 方法。
find() 方法以非结构化的方式来显示所有文档。
语法
MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
>db.col.find().pretty() pretty() 方法以格式化的方式来显示所有文档。
> db.Disney.find().pretty()
{
"_id" : ObjectId("6225f8ed39108c22ab583664"),
"name" : "Mickey",
"type" : "mouse"
}
{
"_id" : ObjectId("6225f90e39108c22ab583665"),
"name" : "Donald",
"type" : "duck"
}
{
"_id" : ObjectId("6225f92839108c22ab583666"),
"name" : "Goofy",
"type" : "dog"
}
{
"_id" : ObjectId("6225f93939108c22ab583667"),
"name" : "Pluto",
"type" : "dog"
}
{
"_id" : ObjectId("6225fc3e39108c22ab58366c"),
"name" : "Minnie",
"type" : "mouse"
}
>
7.4.2 AND
查询
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:>db.col.find({key1:value1, key2:value2}).pretty()
例如我们要找一只名叫Minnie
的耗子
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("62260283f30eb8653fdcae00"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.find({name:'Minnie',type:'mouse'})
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("62260283f30eb8653fdcae00"), "name" : "Minnie", "type" : "mouse" }
>
以上实例中类似于 WHERE 语句:WHERE by=‘Toby’ AND title=‘Toby MongoDB’
7.4.3 OR
查询
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
例如我们要找狗和耗子:
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("62260283f30eb8653fdcae00"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.find({$or:[{type:'dog'},{type:'mouse'}]})
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("62260283f30eb8653fdcae00"), "name" : "Minnie", "type" : "mouse" }
7.4.4 联用AND
和OR
类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘Toby’ OR title = ‘Toby MongoDB’)’
假如我们要找狗,高飞和布鲁托或者都可以:
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("62260283f30eb8653fdcae00"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.find({type:'dog',$or:[{name:'Goofy'},{name:'Pluto'}]})
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
7.4.5 排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
sort()方法基本语法如下所示:>db.COLLECTION_NAME.find().sort({KEY:1})
例如我们直接对全体的名字进行升序排列
> db.Disney.find()
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("62260283f30eb8653fdcae00"), "name" : "Minnie", "type" : "mouse" }
> db.Disney.find().sort({name:1})
{ "_id" : ObjectId("6225f90e39108c22ab583665"), "name" : "Donald", "type" : "duck" }
{ "_id" : ObjectId("6225f92839108c22ab583666"), "name" : "Goofy", "type" : "dog" }
{ "_id" : ObjectId("6225f8ed39108c22ab583664"), "name" : "Mickey", "type" : "mouse" }
{ "_id" : ObjectId("6225fc3e39108c22ab58366c"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("62260283f30eb8653fdcae00"), "name" : "Minnie", "type" : "mouse" }
{ "_id" : ObjectId("6225f93939108c22ab583667"), "name" : "Pluto", "type" : "dog" }
8.pyMongo
8.1 数据库
8.1.1 连接数据库
>>> import pymongo
>>> myclient=pymongo.MongoClient("mongodb://localhost:27017/")
8.1.2 新建数据库
>>> mydb=myclient["pydb"]
8.1.3 查看已有数据库
>>> myclient.list_database_names()
['admin', 'config', 'local', 'toy']
注意:空数据库不显示
8.2 集合
8.2.1 新建集合
>>> mycolc= mydb['col_set']
8.2.2 查看集合
>>> mydb.list_collection_names()
[]
注意:空集合不显示
8.2.3 删除集合
我们可以使用 drop() 方法来删除一个集合。
>>> mydb.list_collection
Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'pydb'), 'list_collection')
>>> mydb.list_collection_names()
['col_set']
>>> mycol
Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'pydb'), 'col_set')
>>> mycol.drop()
>>> mydb.list_collection_names()
[]
>>>
8.3 文档
8.3.1 插入单个文档
集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典的 (key, value) 数据对。
>>> mydict = {'name':'Mickey','type':'mouse'}
>>> mycol = mydb['col_set']
>>> mycol.insert_one(mydict)
<pymongo.results.InsertOneResult object at 0x7fc67af72200>
8.3.2 插入多个文档
集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。
>>> mylist = [
... { "name": "Tom", "age": "100", "url": "" },
... { "name": "Mary", "age": "101", "url": "" },
... { "name": "Timi", "age": "10", "url": "" },
... ]
>>> x = mycol.insert_many(mylist)
>>> x.inserted_ids
[ObjectId('62260904816a6646b26646ae'), ObjectId('62260904816a6646b26646af'), ObjectId('62260904816a6646b26646b0')]
>>>
8.3.3 查询文档
8.3.3.1 查询一条数据
我们可以使用 find_one() 方法来查询集合中的一条数据。
>>> mycol.find_one()
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
>>>
8.3.3.2 查询所有数据
find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。
>>> mycol.find()
<pymongo.cursor.Cursor object at 0x7fc67af5a490>
>>> [mycol.find()]
[<pymongo.cursor.Cursor object at 0x7fc67af5a520>]
>>> list(mycol.find())
[{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'},
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '100', 'url': ''},
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''},
{'_id': ObjectId('62260904816a6646b26646b0'), 'name': 'Timi', 'age': '10', 'url': ''}]
>>> [i for i in mycol.find()]
[{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'},
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '100', 'url': ''},
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''},
{'_id': ObjectId('62260904816a6646b26646b0'), 'name': 'Timi', 'age': '10', 'url': ''}]
>>> for i in mycol.find(): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '100', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646b0'), 'name': 'Timi', 'age': '10', 'url': ''}
>>>
8.3.3.3 查询数据指定字段
我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
>>> for i in mycol.find({},{ "_id": 0, "name": 1, "age": 1 }): print(i)
...
{'name': 'Mickey'}
{'name': 'Tom', 'age': '100'}
{'name': 'Mary', 'age': '101'}
{'name': 'Timi', 'age': '10'}
>>>
8.3.3.4 查询条件数据
我们可以在 find() 中设置参数来过滤数据。
>>> for i in mycol.find({ "name": "Tom" }): print(i)
...
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '100', 'url': ''}
>>>
8.3.3.5 查询指定条数记录
如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
例如只要前三条:
>>> for i in mycol.find().limit(3): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '100', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
>>>
8.3.4 修改文档
我们可以在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多于一条,则只会修改第一条。
>>> for i in mycol.find(): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '100', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646b0'), 'name': 'Timi', 'age': '10', 'url': ''}
>>> myquery = { "age": "100" }
>>> newvalues = { "$set": { "age": "12345" } }
>>> mycol.update_one(myquery, newvalues)
<pymongo.results.UpdateResult object at 0x7fc67af72880>
>>> for i in mycol.find(): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '12345', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646b0'), 'name': 'Timi', 'age': '10', 'url': ''}
>>>
8.3.5 排序数据
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
>>> for i in mycol.find().sort('age'): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646b0'), 'name': 'Timi', 'age': '10', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '12345', 'url': ''}
>>>
8.3.6 删除文档
8.3.6.1 删除单个
我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
>>> for i in mycol.find(): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '12345', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646b0'), 'name': 'Timi', 'age': '10', 'url': ''}
>>> mycol.delete_one({ "name": "Timi" })
<pymongo.results.DeleteResult object at 0x7fc67af7bfc0>
>>> for i in mycol.find(): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '12345', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
>>>
8.3.6.2 删除所有
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:
>>> for i in mycol.find(): print(i)
...
{'_id': ObjectId('62260864816a6646b26646ad'), 'name': 'Mickey', 'type': 'mouse'}
{'_id': ObjectId('62260904816a6646b26646ae'), 'name': 'Tom', 'age': '12345', 'url': ''}
{'_id': ObjectId('62260904816a6646b26646af'), 'name': 'Mary', 'age': '101', 'url': ''}
>>> x = mycol.delete_many({})
>>> x.deleted_count
3
>>> for i in mycol.find(): print(i)
...
>>>