100天精通Python——第40天:操作MongoDB数据库

在这里插入图片描述

文章目录

  • 每篇前言
  • 一、安装pymongo库
  • 二、数据库操作
    • 1、连接数据库
    • 2、数据库操作
    • 3、集合操作
    • 4、插入文档
      • 插入一个文档
      • 插入多个文档
      • 插入指定 _id 的多个文档
    • 5、查看文档
      • 查询一条数据
      • 查询集合中所有数据
      • 查询指定字段的数据
      • 根据指定条件查询
      • 高级查询
      • 使用正则表达式查询
      • 返回指定条数记录
    • 6、修改文档
      • 修改一条
      • 修改全部
    • 7、删除数据
      • 输出一个文档
      • 删除多个文档
      • 删除集合中的所有文档
      • 删除集合
    • 8、排序
      • 升序
      • 降序
  • 三、 如何让学习更加高效呢?

每篇前言

  • 作者介绍:Python领域优质创作者、华为云享专家、阿里云专家博主、2021年CSDN博客新星Top6

  • 本文已收录于Python全栈系列专栏:《100天精通Python从入门到就业》
  • ​​此专栏文章是专门针对Python零基础小白所准备的一套完整教学,从0到100的不断进阶深入的学习,各知识点环环相扣
  • 订阅专栏后续可以阅读Python从入门到就业100篇文章还可私聊进两百人Python全栈交流群(手把手教学,问题解答); 进群可领取80GPython全栈教程视频 + 300本计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述
在这里插入图片描述

一、安装pymongo库

如果MongoDB不会的,博主为你们准备了基础教程:MongoDB数据库入门到精通看这一篇就够了

cmd 控制台中输入:

pip install pymongo

100天精通Python——第40天:操作MongoDB数据库_第1张图片

二、数据库操作

1、连接数据库

创建数据库连接需要使用 MongoClient 对象,并且指定连接的 IP 地址、端口号,创建的数据库名

from pymongo import MongoClient


def mongodb_init01():
    """数据库连接方式1"""
    client = MongoClient(host='127.0.0.1', port=27017)
    print(client)


def mongodb_init02():
    """数据库连接方式2"""
    uri = "mongodb://{}:{}".format('127.0.0.1', 27017)
    client = MongoClient(uri)
    print(client)


if __name__ == '__main__':
    mongodb_init01()
    mongodb_init02()

输出结果:

MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)
MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)

2、数据库操作

数据库的相关操作有:查看所有数据库名称、判断数据库是否存在、使用现有数据库,创建不存在的数据库,删除数据库

# 返回当前所有数据库名称
databases_list = client.list_database_names()

# 判断数据库是否存在
if 'test001' in database_names:
    print("数据库已存在")
else:
    print("数据库不存在")
    
# 使用现有数据库(数据库名:test_database)
test_database = client.test_database

# 创建不存在的数据库并使用
new_database = client.new_database

# 删除现有数据库
client.drop_database('new_database')

注意:

  • database_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_database_names()
  • 在 MongoDB 中,数据库只有在内容插入后才会创建。就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。

3、集合操作

集合的相关操作有:查看所有集合名称、判断集合是否存在、使用现有集合,创建不存在的集合,删除集合

# 查看当前数据库中的所有集合
collection_names = new_database.list_collection_names()

# 判断一个集合是否存在
if 'test001' in collection_names:
    print("集合已存在")
else:
    print("集合不存在")

# 获取指定数据库下的所有集合对象
collections = test_database.list_collections()
for collection in collections:
    print('获取集合:', collection)
      
# 使用一个已存在数集合(集合名称:test_collection)
test_collection = new_database.test_collection

# 创建一个新的集合
new_collection = new_database.new_collection

# 删除一个集合
new_database.drop('new_collection')

注意:

  • collection_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_collection_names()
  • 在 MongoDB 中,集合只有在内容插入后才会创建。就是说,集合创建后要插入一个数据,集合才会真正创建。

4、插入文档

MongoDB 中的一个文档类似 SQL 表中的一条记录

插入一个文档

集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典 name => value 对

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

# 使用insert_one插入一条数据
x = new_collection.insert_one({"name": "张三", "age": 18})

print(x)  # 输出结果:

打开可视化工具查看结果:
100天精通Python——第40天:操作MongoDB数据库_第2张图片

插入多个文档

集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

mylist = [
    {"name": "张飞", "hometown": "蜀国", "age": 30, "sex": "男"},
    {"name": "关羽", "hometown": "蜀国", "age": 40, "sex": "男"},
    {"name": "刘备", "hometown": "蜀国", "age": 50, "sex": "男"},
    {"name": "曹操", "hometown": "魏国", "age": 45, "sex": "男"},
    {"name": "司马懿", "hometown": "魏国", "age": 45, "sex": "男"},
    {"name": "孙权", "hometown": "吴国", "age": 50, "sex": "男"},
    {"name": "貂蝉", "hometown": "未知", "age": 18, "sex": "女"},
    {"name": "西施", "hometown": "越国", "age": 18, "sex": "女"},
    {"name": "王昭君", "hometown": "西汉", "age": 18, "sex": "女"},
    {"name": "杨玉环", "hometown": "唐朝", "age": 18, "sex": "女"}
]

# 使用insert_many插入多条数据
x = new_collection.insert_many(mylist)

打开可视化工具查看结果:
100天精通Python——第40天:操作MongoDB数据库_第3张图片

插入指定 _id 的多个文档

我们也可以自己指定 _id插入,以下实例我们在 new_collection1 集合中插入数据,_id 为我们指定的:

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection1 = new_database.new_collection1

mylist = [
    {"_id": 1, "name": "小红"},
    {"_id": 2, "name": "小黑"},
    {"_id": 3, "name": "小白"},
    {"_id": 4, "name": "小蓝"},
    {"_id": 5, "name": "小黄"}
]

# 使用insert_many插入多条数据
x = new_collection1.insert_many(mylist)

# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)  # 输出结果:[1, 2, 3, 4, 5]

打开可视化工具查看结果:
100天精通Python——第40天:操作MongoDB数据库_第4张图片

5、查看文档

MongoDB 中使用了 find() 和 find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。

查询一条数据

我们可以使用 find_one() 方法来查询集合中的一条数据

例如:查看 new_collection 集合一条数据

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

x = new_collection.find_one()

print(x)

输出结果:

{'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}

查询集合中所有数据

find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。

例如:查看 new_collection 集合中所有数据

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

for x in new_collection.find():
    print(x)

输出结果:

{'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
{'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

查询指定字段的数据

我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。

例如:只查看 new_collection 集合中的 name 字段

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

for x in new_collection.find({}, {"_id": 0, "name": 1}):
    print(x)

输出结果:

{'name': '张三'}
{'name': '张飞'}
{'name': '关羽'}
{'name': '刘备'}
{'name': '曹操'}
{'name': '司马懿'}
{'name': '孙权'}
{'name': '貂蝉'}
{'name': '西施'}
{'name': '王昭君'}
{'name': '杨玉环'}

注意:除了 _id,你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。

根据指定条件查询

我们可以在 find() 中设置参数来过滤数据。

例如:查看 new_collection 集合中 age 为 18 的数据

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myquery = {"age": 18}

mydoc = new_collection.find(myquery)

for x in mydoc:
    print(x) 

输出结果:

{'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
{'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

高级查询

查询的条件语句中,我们还可以使用修饰符

例如:查看 new_collection 集合中 age 大于 18 的数据

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myquery = {"age": {"$gt": 18}}

mydoc = new_collection.find(myquery)

for x in mydoc:
    print(x)

输出结果:

{'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}

使用正则表达式查询

我们还可以使用正则表达式作为修饰符。正则表达式修饰符只用于搜索字符串的字段。

案例:查看name 以张开头的数据,正则表达式修饰符条件为 {"$regex": “^张”}

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myquery = {"name": {"$regex": "^张"}}

mydoc = new_collection.find(myquery)

for x in mydoc:
    print(x)

输出结果:

{'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
{'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}

返回指定条数记录

如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。

案例:以下实例返回 3 条文档记录:

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myresult = new_collection.find().limit(3)

# 输出结果
for x in myresult:
    print(x)

输出结果:

{'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
{'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}

6、修改文档

修改一条

我们可以在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。

如果查找到的匹配数据多于一条,则只会修改第一条。

案例:把张三的名字修改为 张三三

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myquery = {"name": "张三"}
newvalues = {"$set": {"name": "张三三"}}

new_collection.update_one(myquery, newvalues)

打开可视化工具查看结果:

100天精通Python——第40天:操作MongoDB数据库_第5张图片

修改全部

update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()。
案例:把 集合中姓张的修改为李好啊

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myquery = {"name": {"$regex": "^张"}}
newvalues = {"$set": {"name": "李好啊"}}

new_collection.update_many(myquery, newvalues)

打开可视化工具查看结果:
100天精通Python——第40天:操作MongoDB数据库_第6张图片

7、删除数据

输出一个文档

我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myquery = {"name": "关羽"}

new_collection.delete_one(myquery)

# 删除后输出
for x in new_collection.find():
    print(x)

输出结果:

{'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '李好啊', 'age': 18}
{'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '李好啊', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

删除多个文档

我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

删除所有 name 字段中以 李 开头的文档:

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

myquery = {"name": {"$regex": "^李"}}

x = new_collection.delete_many(myquery)

print(x.deleted_count, "个文档已删除")

# 删除后输出
for x in new_collection.find():
    print(x)

输出结果:

2 个文档已删除
{'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
{'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

删除集合中的所有文档

delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

x = new_collection.delete_many({})

print(x.deleted_count, "个文档已删除")

# 删除后输出
for x in new_collection.find():
    print(x)

输出结果:

8 个文档已删除

删除集合

我们可以使用 drop() 方法来删除一个集合。

以下实例删除了 customers 集合:

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

new_collection.drop()

打开可视化工具查看结果:已经没有 new_collection 了100天精通Python——第40天:操作MongoDB数据库_第7张图片

8、排序

sort() 方法可以指定升序或降序排序。

sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。

升序

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

mylist = [
    {"name": "张飞", "hometown": "蜀国", "age": 30, "sex": "男"},
    {"name": "关羽", "hometown": "蜀国", "age": 40, "sex": "男"},
    {"name": "刘备", "hometown": "蜀国", "age": 50, "sex": "男"}
]

# 使用insert_many插入多条数据
x = new_collection.insert_many(mylist)

mydoc = new_collection.find().sort("name")
for x in mydoc:
    print(x)

降序

from pymongo import MongoClient

client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)

# 创建新的数据库
new_database = client.new_database

# 创建一个新的集合
new_collection = new_database.new_collection

mydoc = new_collection.find().sort("age", -1)
for x in mydoc:
    print(x)

输出结果:

{'_id': ObjectId('6223589a5fbb76bdbb85050c'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
{'_id': ObjectId('6223589a5fbb76bdbb85050b'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
{'_id': ObjectId('6223589a5fbb76bdbb85050a'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}

三、 如何让学习更加高效呢?

1. 编程小白选手

很多刚入门编程的小白学习了基础语法,却不知道语法的用途,不知道如何加深映像,不知道如何提升自己,这个时候每天刷自主刷一道题就非常重要(百炼成神),可以去牛客网上的编程初学者入门训练。该专题为编程入门级别,适合刚学完语法的小白练习,题目涉及编程基础语法,基本结构等,每道题带有练习模式和考试模式,可还原考试模式进行模拟,也可通过练习模式进行练习。

链接地址:牛客网 | 编程初学者入门训练
在这里插入图片描述
2. 编程进阶选手

当基础练习完已经逐步掌握了各知识要点后,这个时候去专项练习中学习数据结构、算法基础、计算机基础等。先从简单的入手,感觉上来了再做中等难度,以及较难的题目。这三样是面试中必考的知识点,我们只有坚持每日自己去多加练习,拒绝平躺持续刷题,不断提升自己才能冲击令人满意的公司。

链接地址:牛客网 | 专项练习
在这里插入图片描述
速度上号,大家一起冲击大厂,有疑问评论区留言解答!!!

你可能感兴趣的:(python,数据库,mongodb,数据分析,数据挖掘)