python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。

参考:
官方文档:https://pymongo.readthedocs.io/en/stable/
github:https://github.com/mongodb/mongo-python-driver

一. 插入数据案例

# -*- encoding: utf-8 -*-
import time
import pymongo
import datetime

# 创建对象
client = pymongo.MongoClient('mongodb://账号:密码@主机:端口号/?authSource=admin')
# 连接DB数据库
db = client['数据库名']


def insert_one():
    # 连接集合user,集合类似于关系数据库的数据表; 如果集合不存在,就会新建集合user
    user_collection = db.user_demo
    # 设置文档格式(文档即我们常说的数据)
    user_info = {
   
        "_id": 105,
        "author": "小绿",
        "text": "Python开发",
        "tags": ["mongodb", "pymongo"],
        "date": datetime.datetime.now()}

    # 使用insert_one单条添加文档,inserted_id获取写入后的id
    # 添加文档时,如果文档尚未包含"_id"键,就会自动添加"_id"。"_id"的值在集合中必须是唯一的
    # inserted_id用于获取添加后的id,若不需要,则可以去掉
    user_id = user_collection.insert_one(user_info).inserted_id
    print("user id is ", user_id)


def insert_many():
    #批量添加
    user_infos = [{
   
        "_id": 101,
        "author": "小黄",
             "text": "Python开发",
             "tags": ["mongodb", "python", "pymongo"],
             "date": datetime.datetime.utcnow()},
     {
   
        "_id": 102,
        "author": "小黄_A",
             "text": "Python开发_A",
             "tags": {
   "db":"Mongodb","lan":"Python","modle":"Pymongo"},
             "date": datetime.datetime.utcnow()},
     ]

    user_collection = db.user_insert_many
    # inserted_ids用于获取添加后的id,若不需要,则可以直接去掉
    user_id = user_collection.insert_many(user_infos).inserted_ids
    print("user id is ", user_id)


def bulk_insert_data():
    from pymongo import UpdateOne
    data_list = [{
   'user_id': 5, 'name': '张三1', 'age': 27, 'email': 'zhangsan1@email.com'},
                 {
   'user_id': 6, 'name': '李四1', 'age': 26, 'email': 'lisi1@email.com'},
                 {
   'user_id': 7, 'name': '王五1', 'age': 29, 'email': 'wangwu1@email.com'},
                 {
   'user_id': 8, 'name': '赵六1', 'age': 26, 'email': 'zhaoliu1@email.com'}]
    bulk_data_list = []
    for data in data_list:
        one = UpdateOne({
   "_id": data['user_id']}, {
   
            "$set": {
   "name": data['name'],
                     "age": data['age'],
                     "email": data['email'],
                     "date": datetime.datetime.now()}}, upsert=True)
        bulk_data_list.append(one)

    try:
        collection_item = db.bulk_insert_demo
        collection_item.bulk_write(bulk_data_list)
    except Exception as e:
        print(f'e: {e}')
    print(f"{time.strftime('%Y-%m-%d %H:%M:%S')}, 已存mongo: {len(bulk_data_list)}条")


if __name__ == '__main__':
    # 插入单条数据
    insert_one()

    # 插入多条数据
    # insert_many()

    # 批量插入
    # bulk_insert_data()

二. 查询数据案例

# -*- encoding: utf-8 -*-
import re
import pymongo
# 创建对象
# client = pymongo.MongoClient()
client = pymongo.MongoClient('mongodb://账号:密码@主机:端口号/?authSource=admin')
# 连接DB数据库
db = client['数据库名']


def find_by_condition():
    # 连接集合user,集合类似于关系数据库的数据表, 如果集合不存在,就会新建集合user
    user_collection = db.user
    # 1. 查询文档: find({"_id":101}),其中{"_id":101}为查询条件, 若查询条件为空,则默认查询全部
    # find_value = user_collection.find({"_id": 103})
    # print(list(find_value))

    # 2. 如果要实现多条件查询,$and和$or,使用方法如下:
    # AND条件查询
    # find_value = user_collection.find({"$and": [{"_id": 104}, {"author": "小蓝"}]})
    # print(list(find_value))
    # OR条件查询
    # find_value = user_collection.find({"$or": [{"author": "小黄_A"}, {"author": "小黄"}]})
    # print(list(find_value))

    # 3. 根据范围查找: $gt: 大于, $gte: 大于等于, $lt: 小于, $lte: 小于等于, $ne: 不等于,
    # 如查找id>102且id<104(_id=101)的文档
    # find_value = user_collection.find({"_id": {"$gt": 102, "$lt": 104}})
    # print(list(find_value))
    # 查找id在[100,101]的文档
    # find_value = user_collection.find({"_id": {"$in": [100, 101]}})
    # print(list(find_value))
    # find_value = user_collection.find({"and": [{"_id": {"$gt": 102, "$lt": 105}},
    #                                           {"_id": {"$in": [100, 105]}}]})
    # print(list(find_value))

    # 4. 模糊查询实际上是加入正则表达式实现的
    # # 方法一
    # find_value = user_collection.find({"author": {"$regex": ".*小.*"}})
    # print(list(find_value))
    # #方法二
    regex = re.compile(".*小.*")
    find_value = user_collection.find({
   "author": regex})
    print(list(find_value))

    # 5. 查询嵌入/嵌套文档
    # 查询字段"tags":{"db":"Mongodb","lan":"Python","modle":"Pymongo"}
    # 查询嵌套字段,只需要查询嵌套里的某个值即可
    find_value = user_collection.find({
   "tags.db": "Mongodb"})
    print(list(find_value))

    # 6. 查询字段"tags":{"db":
    # {"Mongodb":"NoSql","MySql":"Sql"},"lan":"Python","modle":"Pymongo"}
    # find_value = user_collection.find({"tags.db.Mongodb": "NoSql"})
    # print(list(find_value))


def find_many():
    user_collection = db.user

    # 1. 查询文档数量
    # result_data = user_collection.count_documents({})
    # print(result_data)

    # 2. 限定返回结果
    # result_data_limit = user_collection.find({}).limit(2)
    # for result in result_data_limit:
    #     print(result)

    # 3. 对查询结果进行排序: 字段值1表示正序, -1表示倒序
    # user_collection = db.bulk_insert_demo
    # result_data_sort = user_collection.find({'age': {'$gt': 22}}).sort([('age', -1)])
    # print(list(result_data_sort))

    # 4. 对数据进行去重
    user_collection = db.bulk_insert_demo
    # 对age字段去重
    result_data_distinct = user_collection.distinct('age')
    print(list(result_data_distinct))
    # 对满足特定条件的age字段去重
    # result_data_distinct = user_collection.distinct('age', {'age': {'$gte': 22}})
    # print(list(result_data_distinct))

    # 5.偏移
    # results = collection.find().sort('id', pymongo.ASCENDING).skip(1)
    # for result in results:
    #     print(result)


if __name__ == '__main__':
    # 根据条件查询文档
    # find_by_condition()

    # 查询数据
    find_many()

三. 更新数据案例

# -*- encoding: utf-8 -*-
import pymongo
# 创建对象
client = pymongo.MongoClient('mongodb://账号:密码@主机:端口号/?authSource=admin')
# 连接DB数据库
db = client['数据库名']


def update_one():
    # update_one(筛选条件,更新内容),筛选条件为空,默认更新第一条文档
    # 如果查询有多条数据,就按照排序先后更新第一条数据
    # {"author": "小蓝"}, {"$set": {"author": "小黄", "text": "数据挖掘"}}
    user_collection = db.user
    user_collection.update_one({
   "author": "小蓝"}, {
   "$set": {
   "author": "小黄", "text": "数据挖掘"}})


def replace_one():
    # replace_one(筛选条件,更新内容)用于将整条数据替换
    # 如果文档的部分数据没有更新,就去除这部分数据
    # topic_data.update_one({"_id": ObjectId(mongo_id)}, {"$set": {'tag_field': 0}})
    user_collection = db.user
    user_collection.replace_one({
   "author": "小绿"},
                                {
   "author": "小绿", "text": "Python_django"})


def update_many():
    # update_many(筛选条件,更新内容)用于批量更新文档, 如果查询有多条数据,就会对全部数据进行更新处理
    # topic_data.update_many({"tag_field": {"$exists": False}}, {"$set": {'tag_field': 0}})
    user_collection = db.user
    user_collection.update_many({
   "author": "小黄"},
                                {
   "$set": {
   "text": "Python_web开发"}})


if __name__ == '__main__':
    # 更新单条文档
    # update_one()

    # 替换一条数据
    replace_one()

    # 更新多条数据
    # update_many()

四. 删除数据案例

# -*- encoding: utf-8 -*-
import pymongo
# 创建对象
# client = pymongo.MongoClient()
client = pymongo.MongoClient('mongodb://账号:密码@主机:端口号/?authSource=admin')
# 连接DB数据库
db = client['数据库名']
user_collection = db.user


def delete_one():
    # 删除单条文档
    # delete_one(筛选条件),筛选条件为空,默认删除第一条文档
    user_collection.delete_one({
   "_id": 100})


def delete_many():
    # delete_many(筛选条件)用于删除多条数据
    user_collection.delete_many({
   "author": "小黄"})


if __name__ == '__main__':
    # 删除单条文档
    delete_one()

    # 删除多条数据
    # delete_many()

五. 聚合查询案例

import pymongo

handler = pymongo.MongoClient().monog_db.example_user

rows = handler.aggregate([
    {
   '$lookup': {
   
        'from': 'example_post',
        'localField': 'id',
        'foreignField': 'user_id',
        'as': 'weibo_info'
        }
    },
    {
   '$unwind': '$weibo_info'},
    {
   '$project': {
   
        'name': 1,
        'work': 1,
        'content': '$weibo_info.content',
        'post_time': '$weibo_info.post_time'}}
])
for row in rows:
    print(row)
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
30天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
18天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
7天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
29 14
|
16天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
53 2
|
30天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
48 10
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
44 12
|
1月前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
1月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
30天前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!