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 对象。字段值可以包含其他文档,数组及文档数组。

goldendb数据库springboot_数据库

3. 特点

  1. MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  2. 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
  3. 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  4. 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  5. Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  6. MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  7. Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  8. Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  9. Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  10. GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  11. MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  12. MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  13. 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的对象和一些更新的操作符(如goldendb数据库springboot_mongodb_02inc…)等,也可以理解为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 联用ANDOR

类似常规 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)
... 
>>>