当前位置: 首页 > news >正文

MongoDB 聚合管道速成教程

一、引言

MongoDB 的聚合管道(Aggregation Pipeline)是一种强大的数据处理工具,它允许你对文档进行一系列的操作,如过滤、转换、分组和聚合等。聚合管道由多个管道组成,每个管道对输入的文档进行特定的处理,并将处理后的结果传递给下一个管道。


二、基础管道

1. 过滤管道 $match 

功能

$match 管道用于过滤文档,它的作用类似于 find() 方法的条件查询。只有满足指定条件的文档才会进入下一个管道。

示例代码

假设我们有一个名为 students 的集合,包含以下文档:

[{ "name": "Alice", "age": 20, "status": "A" },{ "name": "Bob", "age": 17, "status": "B" },{ "name": "Charlie", "age": 22, "status": "A" }
]

 以下是使用 $match 管道过滤出年龄大于等于 18 且状态为 "A" 的学生的聚合管道代码:

from pymongo import MongoClient# 连接到 MongoDB 数据库
uri = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $match 管道,过滤出 age 大于等于 18 且 status 为 "A" 的文档'$match': {'age': {'$gte': 18},'status': "A"}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)# 关闭连接
client.close()

 ’$gte‘是比较操作符(>=),类似的比较操作符如下:

名称

说明

$eq

匹配等于指定值的值。

$gt

匹配大于指定值的值。

$gte

匹配大于等于指定值的值。

$in

匹配数组中指定的任何值。

$lt

匹配小于指定值的值。

$lte

匹配小于等于指定值的值。

$ne

匹配所有不等于指定值的值。

$nin

不匹配数组中指定的任何值。

 结果

执行上述代码后,预期的结果是返回年龄大于等于 18 且状态为 "A" 的学生文档,即:

[{ "name": "Alice", "age": 20, "status": "A" },{ "name": "Charlie", "age": 22, "status": "A" }
]

 2. 分组管道 $group

功能

$group 管道用于按指定字段对文档进行分组,并可以对每个组进行聚合操作,如求和、计数、求平均值等。

示例代码

继续使用 students 集合,以下是按 status 字段分组并统计每组学生数量的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $group 管道,按 status 字段分组'$group': {# _id 是分组的依据字段'_id': "$status",# 统计每组的学生数量'studentCount': {'$sum': 1}}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

结果

执行上述代码后,预期的结果是按 status 字段分组并统计每组的学生数量,结果如下:

[{ "_id": "A", "studentCount": 2 },{ "_id": "B", "studentCount": 1 }
]

 3.投影管道 $project

功能

$project 管道用于选择、重命名或删除字段,还可以计算新的字段。

示例代码

以下是使用 $project 管道选择 name 和 age 字段,并计算 ageInDays 字段(假设一年按 365 天计算)的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $project 管道,选择和计算字段'$project': {# 保留 name 字段'name': 1,# 保留 age 字段'age': 1,# 计算 ageInDays 字段'ageInDays': {'$multiply': ["$age", 365]}}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

结果

执行上述代码后,预期的结果是返回包含 nameage 和 ageInDays 字段的文档,结果如下:

[{ "name": "Alice", "age": 20, "ageInDays": 7300 },{ "name": "Bob", "age": 17, "ageInDays": 6205 },{ "name": "Charlie", "age": 22, "ageInDays": 8030 }
]

 4. 排序管道 $sort

 功能

$sort 管道用于按指定字段对文档进行排序,排序规则为 1 表示升序, -1 表示降序。

示例代码

以下是按 age 字段降序排序的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $sort 管道,按 age 字段降序排序'$sort': {'age': -1}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

 结果

执行上述代码后,预期的结果是按 age 字段降序排列的文档,结果如下:

[{ "name": "Charlie", "age": 22, "status": "A" },{ "name": "Alice", "age": 20, "status": "A" },{ "name": "Bob", "age": 17, "status": "B" }
]

 5. 分页管道 $limit 和 $skip

功能

$limit 管道用于限制返回的文档数量,$skip 管道用于跳过指定数量的文档,通常一起使用来实现分页功能。

示例代码

假设我们要获取第二页的数据,每页显示 1 条记录,以下是对应的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $skip 管道,跳过 1 条记录'$skip': 1},{# $limit 管道,限制返回 1 条记录'$limit': 1}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

 结果

执行上述代码后,预期的结果是跳过第一条记录,返回第二条记录,结果如下:

[{ "name": "Bob", "age": 17, "status": "B" }
]

 三、高级管道

1.展开管道 $unwind

功能

$unwind 管道用于展开数组字段,将包含数组字段的文档拆分成多个文档,每个文档包含数组中的一个元素。

示例代码

假设我们有一个名为 books 的集合,包含以下文档:

[{ "title": "Book 1", "authors": ["Author 1", "Author 2"] },{ "title": "Book 2", "authors": ["Author 3"] }
]

 以下是使用 $unwind 管道展开 authors 数组的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['books']# 定义聚合管道
pipeline = [{# $unwind 管道,展开 authors 数组'$unwind': "$authors"}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

结果

执行上述代码后,预期的结果是将包含数组字段的文档拆分成多个文档,每个文档包含数组中的一个元素,结果如下:

[{ "title": "Book 1", "authors": "Author 1" },{ "title": "Book 1", "authors": "Author 2" },{ "title": "Book 2", "authors": "Author 3" }
]

 2.连接管道 $lookup

功能

$lookup 管道用于在不同的集合之间进行左外连接,类似于 SQL 中的 JOIN 操作。

示例代码

假设我们有两个集合:orders 和 customersorders 集合包含以下文档:

[{ "orderId": 1, "customerId": 1, "amount": 100 },{ "orderId": 2, "customerId": 2, "amount": 200 }
]

 customers 集合包含以下文档:

[{ "customerId": 1, "name": "Customer 1" },{ "customerId": 2, "name": "Customer 2" }
]

以下是使用 $lookup 管道将 orders 集合和 customers 集合进行连接的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
orders_collection = database['orders']# 定义聚合管道
pipeline = [{# $lookup 管道,连接 orders 集合和 customers 集合'$lookup': {# 要连接的集合名称'from': "customers",# 当前集合中用于连接的字段'localField': "customerId",# 要连接的集合中用于连接的字段'foreignField': "customerId",# 连接结果存储的字段名'as': "customerInfo"}}
]# 执行聚合操作
result = list(orders_collection.aggregate(pipeline))
print(result)client.close()

 结果

执行上述代码后,预期的结果是将 orders 集合和 customers 集合进行左外连接,结果如下:

[{"orderId": 1,"customerId": 1,"amount": 100,"customerInfo": [{ "customerId": 1, "name": "Customer 1" }]},{"orderId": 2,"customerId": 2,"amount": 200,"customerInfo": [{ "customerId": 2, "name": "Customer 2" }]}
]

 3.新增管道 $addFields

功能

$addFields 管道用于向文档中添加新的字段,而不影响原有的字段。

示例代码

继续使用 students 集合,以下是使用 $addFields 管道添加 isAdult 字段的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $addFields 管道,添加 isAdult 字段'$addFields': {'isAdult': {'$gte': ["$age", 18]}}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

 结果

执行上述代码后,预期的结果是向文档中添加 isAdult 字段,该字段表示学生是否成年,结果如下:

[{ "name": "Alice", "age": 20, "status": "A", "isAdult": true },{ "name": "Bob", "age": 17, "status": "B", "isAdult": false },{ "name": "Charlie", "age": 22, "status": "A", "isAdult": true }
]

4.设置管道 $set

功能

$set 管道用于更新或添加字段,如果字段已经存在,则更新其值;如果字段不存在,则添加该字段。

示例代码

以下是使用 $set 管道更新 status 字段为 "completed" 的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $set 管道,更新 status 字段'$set': {'status': "completed"}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

 结果

执行上述代码后,预期的结果是将所有文档的 status 字段更新为 "completed",结果如下:

[{ "name": "Alice", "age": 20, "status": "completed" },{ "name": "Bob", "age": 17, "status": "completed" },{ "name": "Charlie", "age": 22, "status": "completed" }
]

 5. 地图管道 $geoNear 

功能

$geoNear 管道用于基于地理位置进行查询,返回距离指定坐标点最近的文档。

示例代码

假设我们有一个名为 places 的集合,包含以下文档:

[{"name": "Place 1","location": {"type": "Point","coordinates": [116.4074, 39.9042]}},{"name": "Place 2","location": {"type": "Point","coordinates": [116.4174, 39.9142]}}
]

 以下是使用 $geoNear 管道查询距离坐标点 [116.4074, 39.9042] 最近的地点的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['places']# 创建 2dsphere 索引,用于地理空间查询
collection.create_index([("location", "2dsphere")])# 定义聚合管道
pipeline = [{# $geoNear 管道,查询距离指定坐标点最近的地点'$geoNear': {# 指定查询的中心点坐标'near': {'type': "Point", 'coordinates': [116.4074, 39.9042]},# 存储计算出的距离的字段名'distanceField': "distance",# 最大查询距离(单位:米)'maxDistance': 10000,# 是否返回包含中心点的文档'spherical': True}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

结果

执行上述代码后,预期的结果是返回距离指定坐标点最近的地点文档,并在文档中添加 distance 字段表示距离中心点的距离。因为 Place 1 的坐标与查询中心点坐标相同,所以它会排在第一位,Place 2 排在第二位,结果大致如下(distance 值会根据实际计算得出):

[{"name": "Place 1","location": {"type": "Point","coordinates": [116.4074, 39.9042]},"distance": 0},{"name": "Place 2","location": {"type": "Point","coordinates": [116.4174, 39.9142]},"distance": 1234 // 实际距离值}
]

四、其他常用管道

1. 分组连接管道 $graphLookup

功能

$graphLookup 管道用于处理图结构数据,例如树状关系。它可以从一个集合中递归地查找相关文档。

示例代码

假设我们有一个名为 employees 的集合,存储员工及其上级关系,文档结构如下:

[{ "_id": 1, "name": "Alice", "managerId": null },{ "_id": 2, "name": "Bob", "managerId": 1 },{ "_id": 3, "name": "Charlie", "managerId": 2 }
]

 以下是使用 $graphLookup 管道查找每个员工的所有上级的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['employees']# 定义聚合管道
pipeline = [{# $graphLookup 管道,查找每个员工的所有上级'$graphLookup': {# 要查找的集合'from': "employees",# 起始字段,即当前文档中用于开始查找的字段'startWith': "$managerId",# 连接字段,用于递归查找'connectFromField': "managerId",# 被连接字段,与 connectFromField 对应'connectToField': "_id",# 存储查找结果的字段名'as': "managers"}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

结果

执行上述代码后,预期的结果是为每个员工文档添加一个 managers 数组字段,其中包含该员工的所有上级信息。例如:

[{"_id": 1,"name": "Alice","managerId": null,"managers": []},{"_id": 2,"name": "Bob","managerId": 1,"managers": [{ "_id": 1, "name": "Alice", "managerId": null }]},{"_id": 3,"name": "Charlie","managerId": 2,"managers": [{ "_id": 2, "name": "Bob", "managerId": 1 },{ "_id": 1, "name": "Alice", "managerId": null }]}
]

 2.面管道 $facet

功能

$facet 管道允许在单个聚合管道中执行多个不同的聚合操作,并将结果分组返回。这对于在一个查询中进行多维度分析非常有用。

示例代码

继续使用 students 集合,以下是使用 $facet 管道同时进行分页和统计学生总数的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $facet 管道,同时进行分页和统计'$facet': {# 分页操作'paginatedResults': [{'$skip': 0},{'$limit': 2}],# 统计学生总数'totalCount': [{'$count': "total"}]}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

结果

执行上述代码后,预期的结果是返回一个包含两个字段的文档,paginatedResults 字段包含分页后的学生文档,totalCount 字段包含学生总数。例如:

[{"paginatedResults": [{ "name": "Alice", "age": 20, "status": "A" },{ "name": "Bob", "age": 17, "status": "B" }],"totalCount": [{ "total": 3 }]}
]

 3. 分阶管道 $bucket 和 $bucketAuto

功能

$bucket 管道用于将文档分到不同的区间(桶)中,需要手动指定区间边界;$bucketAuto 管道则会自动将文档分到指定数量的区间中。

示例代码($bucket

以下是使用 $bucket 管道按 age 字段将学生文档分到不同区间的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $bucket 管道,按 age 字段分组'$bucket': {# 分组依据字段'groupBy': "$age",# 区间边界'boundaries': [15, 20, 25],# 缺省桶,用于存储不在指定区间内的文档'default': "Other",# 每个桶中要统计的信息'output': {'count': {'$sum': 1}}}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

 结果

执行上述代码后,预期的结果是将学生文档按 age 字段分到不同的区间中,并统计每个区间的文档数量。例如:

[{ "_id": 15, "count": 1 },{ "_id": 20, "count": 1 },{ "_id": "Other", "count": 1 }
]

示例代码($bucketAuto

以下是使用 $bucketAuto 管道按 age 字段自动将学生文档分到 2 个区间的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $bucketAuto 管道,自动分组'$bucketAuto': {# 分组依据字段'groupBy': "$age",# 区间数量'buckets': 2,# 每个桶中要统计的信息'output': {'count': {'$sum': 1}}}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

结果

执行上述代码后,预期的结果是将学生文档按 age 字段自动分到 2 个区间中,并统计每个区间的文档数量。例如:

[{"_id": {"min": 17,"max": 20},"count": 2},{"_id": {"min": 20,"max": 22},"count": 1}
]

4.输出管道 $out 

功能

$out 管道用于将聚合结果输出到一个新的集合中。

示例代码

以下是使用 $out 管道将过滤后的学生文档输出到一个新集合 filtered_students 中的聚合管道代码:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $match 管道,过滤出 age 大于等于 18 的学生'$match': {'age': {'$gte': 18}}},{# $out 管道,将结果输出到新集合'$out': "filtered_students"}
]# 执行聚合操作
list(collection.aggregate(pipeline))
print("聚合结果已输出到 filtered_students 集合")client.close()

 结果

执行上述代码后,会在数据库中创建一个名为 filtered_students 的新集合,其中包含年龄大于等于 18 的学生文档。可以通过查询该集合来验证结果:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['filtered_students']# 查询新集合中的文档
result = list(collection.find())
print(result)client.close()

 预期结果与 $match 管道过滤后的结果相同:

[{ "name": "Alice", "age": 20, "status": "A" },{ "name": "Charlie", "age": 22, "status": "A" }
]

五、管道使用建议

1. 管道的组合使用

通过多个管道的组合可以实现复杂的逻辑。例如,先使用 $match 管道过滤数据,减少后续管道处理的数据量,再使用 $group 管道进行分组统计。以下是一个组合示例:

from pymongo import MongoClienturi = 'mongodb://localhost:27017'
client = MongoClient(uri)
database = client['testdb']
collection = database['students']# 定义聚合管道
pipeline = [{# $match 管道,过滤出 age 大于等于 18 的学生'$match': {'age': {'$gte': 18}}},{# $group 管道,按 status 字段分组并统计每组学生数量'$group': {'_id': "$status",'studentCount': {'$sum': 1}}}
]# 执行聚合操作
result = list(collection.aggregate(pipeline))
print(result)client.close()

 2. 性能优化

  • 优先使用 $match 或 $limit 管道:在聚合管道的开头使用 $match 管道过滤数据,减少后续管道处理的数据量;使用 $limit 管道限制返回的文档数量,避免处理过多不必要的数据。
  • 避免在 $group 管道中使用复杂表达式:复杂的表达式会增加计算量,影响性能。尽量在 $group 管道之前进行数据处理,将复杂的计算放到 $project 管道。

3. 参考官方文档

MongoDB 的官方文档提供了完整的聚合管道列表和详细的示例,建议参考 MongoDB Aggregation Pipeline 获取更多信息。

通过本教程,你应该对 MongoDB 聚合管道的常用管道有了更深入的了解,可以根据具体需求选择合适的管道组合来完成数据处理任务。

相关文章:

MongoDB 聚合管道速成教程

一、引言 MongoDB 的聚合管道(Aggregation Pipeline)是一种强大的数据处理工具,它允许你对文档进行一系列的操作,如过滤、转换、分组和聚合等。聚合管道由多个管道组成,每个管道对输入的文档进行特定的处理&#xff0…...

「JavaScript深入」二进制数据处理详解「Blob、File、FileReader、ArrayBuffer、Typed Arrays、DataView」

二进制数据处理详解 1. Blob(Binary Large Object)Blob 的特性创建 BlobBlob 主要方法Blob 的应用 2. FileFile 对象的属性获取 File 对象 3. FileReader创建 FileReader主要方法主要事件文件上传与读取内容示例文件分块读取示例 4. ArrayBuffer 与 Type…...

信号处理之插值、抽取与多项滤波

信号处理之插值、抽取与多项滤波 一、问题背景 插值(Interpolation)与抽取(Decimation)是数字信号处理中采样率转换的核心操作: 插值:在信号中插入新样本以提高采样率( L L L倍)抽取:按比例 M M M降低采样率&#xf…...

关于WPS的Excel点击单元格打开别的文档的两种方法的探究

问题需求 目录和文件结构如下: E:\Dir_Level1 │ Level1.txt │ └─Dir_Level2│ Level2.txt│ master.xlsx│└─Dir_Level3Level3.txt现在要在master.xlsx点击单元格进而访问Level1.txt、Level2.txt、Level3.txt这些文件。 方法一:“单元格右键…...

蓝桥 2109统计子矩阵

问题描述 给定一个NM 的矩阵 A, 请你统计有多少个子矩阵 (最小 11, 最大 NM) 满足子矩阵中所有数的和不超过给定的整数 K ? 输入格式 第一行包含三个整数 N,M 和 K. 之后 NN 行每行包含 M 个整数, 代表矩阵 A. 输出格式 一个整数代表答案。 样例输入 3 4 10 1 2 3 4 5…...

AF3 make_fixed_size函数解读

AlphaFold3 data_transforms 模块的 make_fixed_size 函数的作用是将输入的蛋白质特征字典 protein 中的各个特征张量调整为固定大小。这是为了确保在批量处理时,所有特征张量的形状一致,从而避免形状不匹配的问题。 源代码: import itertools import torch from src.con…...

前端模块管理新思路:如何使用 Import Maps

前言 前端开发中,我们常常需要使用各种库和模块来构建功能丰富的应用。在传统方式中,管理这些库和模块的引用可能会有些繁琐。 幸运的是,Import Maps 的出现为我们提供了一种更简洁和高效的解决方案。今天我们就来聊聊如何使用 Import Maps。…...

交换机、路由器、网关、MAC地址——从入门到实战

你是否好奇,当你在手机上点击一个网页链接时,数据是如何从你的设备“飞”到千里之外的服务器并返回的?背后离不开交换机、路由器、网关和MAC地址的默契配合。本文用通俗语言实战场景,带你彻底搞懂这些网络核心组件,从此…...

【江协科技STM32】ADC数模转换器-学习笔记

ADC简介 ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁,ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…...

LanceDB快速入门之基本操作与API一览

LanceDB可以以多种方式运行 可以嵌入到现有后端(如您的 Django、Flask、Node.js 或 FastAPI 应用程序)中直接从如 Jupyter 笔记本等客户端应用程序中用于分析工作负载部署为远程无服务器数据库 安装 Python: pip install lancedbTypeScrip…...

Spring Boot 整合 Redis

以下是 Spring Boot 整合 Redis 的指南&#xff0c;涵盖配置、基本操作、高级用法及常见问题解决。 1. 添加依赖 在 pom.xml 中添加 Spring Data Redis 和连接池依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId&…...

七层协议攻防实战:从HTTP慢速攻击到DNS隧道检测

一、七层协议攻击类型与特征 攻击类型协议特征HTTP慢速攻击HTTP低速率发送不完整请求DNS隧道DNS异常长域名、高频率TXT查询API滥用攻击HTTP高频调用关键接口&#xff08;如短信发送&#xff09;WebSocket洪水WebSocket海量小消息耗尽服务器资源 二、HTTP协议深度防护 1. 慢速…...

Java CAS(Compare-And-Swap)概念及原理

Java CAS&#xff08;Compare-And-Swap&#xff09;概念及原理 1. CAS的基本概念 CAS&#xff08;Compare-And-Swap&#xff09;是一种无锁编程的核心技术&#xff0c;用于实现多线程环境下的原子操作。其核心思想是&#xff1a; “先比较&#xff0c;再交换”。具体操作包含…...

内存检测工具——Qt Creator

前言 检测内存错误的工具&#xff0c;有很多个&#xff0c;我今天粗浅的学了一下可在Qt上使用的工具们&#xff1a; Dr.Memory 工具之前我曾在关注的博主上看到相关的博客&#xff1a;C(Qt)软件调试---内存调试器Dr.Memory&#xff08;21&#xff09;_dr. memory-CSDN博客 今…...

Ubuntu切换lowlatency内核

文章目录 一. 前言二. 开发环境三. 具体操作 一. 前言 低延迟内核&#xff08;Lowlatency Kernel&#xff09; 旨在为需要低延迟响应的应用程序设计的内核版本。Linux-lowlatency特别适合音频处理、实时计算、游戏和其他需要及时响应的实时任务。其主要特点是优化了中断处理、调…...

侯捷 C++ 课程学习笔记:STL标准库与泛型编程

STL 体系结构基础介绍 STL 六大部件&#xff1a; 容器&#xff08;Containers&#xff09; 分配器&#xff08;Allocators&#xff09; …...

Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

19874并查集

19874并查集 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;并查集、数据结构 &#x1f4d6; &#x1f4da; import java.util.*;public class Main {static int N 100010;static int[] a new int[N];static int[] p new int[N];static int n;static int m;st…...

ABC 376

目录 D. Cycle D. Cycle&#xff08;改&#xff09; E. Max Sum D. Cycle 这道题就是个 01 最短路&#xff0c;直接从 1 开始 bfs 看能不能回到 1 #include<bits/stdc.h> #define int long long using namespace std; const int N 2e5 5, INF 1e18;struct node {int …...

win32汇编环境,对 WM_MOUSEMOVE 消息的理解

;运行效果 ;win32汇编环境,对 WM_MOUSEMOVE 消息的理解 ;理解在 WM_MOUSEMOVE 消息发生时&#xff0c;同时来的wParam和lParam值的含义&#xff0c;并取出各自的值进行运用。从这例子也可以更好的理解windows的消息机制. ;WM_MOUSEMOVE消息就是当鼠标移动时&#xff0c;发送给窗…...

第27周JavaSpringboot电商进阶开发 2.常用功能进阶

电商常用功能进阶 - 课程笔记整理 Excel解析与处理 一、课程内容概述 本小节开始进入电商常用功能进阶部分&#xff0c;主要讲解以下内容&#xff1a; Excel的解析和处理商品图片的处理Valid注解对列表的验证订单数变化趋势图Spring Boot高级功能 二、Excel解析与处理的背…...

网络安全基础知识:从零开始了解网络安全

### 网络安全基础知识&#xff1a;从零开始了解网络安全 欢迎来到《零基础入门到独立参加网络安全比赛》系列教程的第一篇&#xff01;在这篇文章中&#xff0c;我们将从最基础的概念开始&#xff0c;深入探讨网络安全的定义、重要性、常见的网络攻击类型&#xff0c;以及网络…...

【A2DP】蓝牙A2DP协议剖析:从架构到规范

目录 一、A2DP 协议架构 1.1 A2DP 协议栈结构组成 1.2 协议栈各部分的关系与作用 二、设备配置与角色定义&#xff08;Configurations and roles &#xff09; 2.1 角色定义 2.2 配置示例与角色体现 三、用户需求与场景 3.1 用户需求与场景 3.2 协议限制 3.3 协议要求…...

python力扣15. 三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&am…...

Linux之系统文件目录理解

1.boot/ 存储启动系统的相关文件的 2.swap/ 虚拟内存 3.dev/ 用于存放设备文件&#xff08;device files&#xff09;。这些文件是操作系统与硬件设备之间的接口&#xff0c;允许用户和程序通过文件操作的方式访问硬件资源 字符设备&#xff08;Character Devices&#xf…...

uvm_transaction, uvm_seq_item, uvm_object, uvm_component的关系

uvm_object ├── uvm_component (验证环境中的静态组件) └── uvm_transaction└── uvm_sequence_item (用于sequence-driver交互的事务) 2. 核心类的作用与区别 (1) uvm_object 定位&#xff1a;所有UVM类的基类。 功能&#xff1a; 提供基础的对象操作&…...

Reflect.get和target[key]有何不同?

主要区别在this指向不同&#xff0c;下面输出张三还是李四?&#xff1a; const person{name:张三,get FullName(){return this.name;},};let personProxynew Proxy(person,{get(target,key){return Reflect.get(target,key)//或者return target[key]}});const p1{__proto__:pe…...

K8s 1.27.1 实战系列(十)PV PVC

一、核心概念与关系 ​1、PV(Persistent Volume)​ PV 是集群中的持久化存储资源,由管理员预先创建并配置,独立于 Pod 生命周期。它抽象了底层存储(如 NFS、云存储等),定义存储容量、访问模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等属性。例如,一…...

JQuery

1.jquery介绍 jQuery是目前使用最广泛的javascript函数库。据统计&#xff0c;全世界排名前100万的网站&#xff0c;有46%使用jQuery&#xff0c;远远超过其他库。微软公司甚至把jQuery作为他们的官方库。 jQuery的版本分为1.x系列和2.x、3.x系列&#xff0c;1.x系列兼容低版…...

「AI 加持的高效架构」高并发场景下的服务器成本优化

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

html css 笔记

01_浏览器相关知识 五大主流浏览器&#xff1a; Chrome Safari IE Firefox Opera (拥有自己的内核) 四大内核: webkit Trident Gecko blink. 02_网页相关知识 构成 网址 网站 网页 网页标准&#xff1a; 结构 表现 行为 分别对应 HTML CSS JavaScript 03_HTML简介 H…...

通义万相 2.1:AIGC 领域的 “王炸” 组合如何颠覆创作生态?

引言 在数字化和人工智能的飞速发展中&#xff0c;AIGC&#xff08;AI生成内容&#xff09;技术已经成为推动创作、设计和内容生成领域创新的核心力量。而当通义万相2.1与蓝耘智算平台强强联手&#xff0c;这一“王炸”组合不仅提升了AIGC的效率&#xff0c;还为创作生态带来了…...

Math.NET Numerics 库怎么装

你提到的缺少的库是 Math.NET Numerics。 关于 Math.NET Numerics Math.NET Numerics 是一个用于 .NET 平台的开源数学库&#xff0c;提供了以下功能&#xff1a; 线性代数&#xff08;矩阵运算、求解线性方程组等&#xff09;。数值计算&#xff08;积分、微分、优化等&…...

NPM安装与配置全流程详解(2025最新版)

写目录 一、环境准备与Node.js安装1. 下载Node.js&#xff08;含NPM&#xff09;2. 验证安装 二、NPM核心配置优化1. 全局模块与缓存路径设置2. 镜像加速3. 代理配置&#xff08;企业网络适用&#xff09; 三、NPM基础操作指南1. 项目初始化2. 包管理命令3. 依赖锁定与版本管理…...

python-52-基于Langchain和Faiss实现向量存储和检索的技术原理

文章目录 1 文本加载与预处理1.1 计算文本的MD5哈希值1.2 加载文本并计算哈希2 初始化向量存储2.1 基于Ollama的嵌入模型2.2 获取code和id的对应关系2.3 清空索引向量2.4 基于HuggingFaceEmbeddings的嵌入模型2.4.1 将模型下载到本地2.4.2 使用方式3 添加新文本3.1 处理新文本并…...

游戏引擎学习第140天

回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式&#xff0c;声音在技术上是一个非常特别的存在&#xff0c;但在游戏中进行声音混音的需求其实相对简单明了&#xff0c;所以今天的任务应该不会太具挑战性。 今天我们会编写一个…...

Jetpack Navigation 实战:Fragment 和 Activity 的交互与导航

在 Android 开发中&#xff0c;使用 Jetpack Navigation 组件可以方便地管理 Fragment 和 Activity 之间的导航。以下是如何使用 Jetpack Navigation 实现 Fragment 之间、Activity 之间以及 Activity 与 Fragment 之间跳转的实战示例。 1. 添加依赖 首先&#xff0c;在 build.…...

Linux中的基本指令(上)

目录 ls指令 判断linux中文件 pwd指令 认识路径 ​编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…...

多用户网页在线聊天室(测试报告)

文章目录 多用户网页在线聊天室一&#xff0c;项目概括1.1 项目名称1.2 测试时间1.3 项目背景1.3 编写目的 二&#xff0c;测试计划2.1 测试环境与配置2.2 测试用例2.3实际执行用例2.3.1登录2.3.2聊天消息列表展示2.3.3聊天消息详情页展示2.3.4联系人页展示2.3.5信息的编辑与发…...

字节青训营后端方向的个人总结(2025年3月4日)

字节青训营的结营总结&#xff08;25寒假&#xff09; ——致青训营队友的一封信 明天就是大项目结项的日子了&#xff0c;不知道大家在这方面学习、精进了多少&#xff0c;也许有的朋友收获颇多并且已经完成了项目&#xff0c;我个人对此表示由衷的恭喜和祝贺。 当初自告奋…...

VX iOS分析随记

断SVC的时候看调用栈&#xff0c;发现里面一个特别大的ollvm函数。vx版本8054 * thread #36, queue com.apple.root.default-qos, stop reason breakpoint 4.1 frame #0: 0x0000000111ad6124 WeChat___lldb_unnamed_symbol1315083 20 WeChat___lldb_unnamed_symbol13150…...

docker 小记

一、卸载 查看当前版本 docker -v2. 如果有&#xff0c;先停止docker systemctl stop docker如果是yum安装&#xff0c;卸载方式为 #已防版本冲突&#xff0c;直接卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…...

AI代码编程辅助工具

现在AI火的一塌糊涂&#xff0c;作为技术应该更应该关注当前AI对编程行业的影响。 分享下当前网络上最火的网络编程辅助工具。 以下是个人搜集到的可以对编程起辅助作用的工具&#xff1a; 2025年最佳AI编程辅助工具 1. GitHub Copilot 这个工具也许你已经在使用了&#xff0…...

使用 kubectl cp 命令可以在 Kubernetes Pod 和本地主机之间拷贝文件或文件夹

使用 kubectl cp 命令可以在 Kubernetes Pod 和本地主机之间拷贝文件或文件夹 kubectl cp <namespace>/<pod-name>:<pod-path> <local-path> # 从 Pod 拷贝到本地 kubectl cp <local-path> <namespace>/<pod-name>:<pod-path&g…...

【eNSP实战】交换机配置端口隔离

交换机端口隔离可以实现在同一个VLAN内对端口进行逻辑隔离&#xff0c;端口隔离分为L2层隔离和L3层隔离&#xff0c;这里只进行L2层隔离演示。 拓扑图 路由器AR1配置GE 0/0/1配置IP&#xff0c;其余PC主机各自配置IP和网关。 现将PC1到PC4四个主机全部进行L2层隔离&#xff0c…...

动态规划-第2篇

前言&#xff1a;在上一篇文章中&#xff0c;我们了解了动态规划的基本概念和解决问题的基本思路。通过分解问题、存储子问题的解&#xff0c;动态规划为我们提供了高效的解决方案。然而&#xff0c;动态规划并不是一成不变的&#xff0c;它有很多不同的技巧和变种&#xff0c;…...

数据库查问题常用OS命令汇总

1、内存使用情况查看 top //查看活跃进程占用情况 free -mh //查看操作系统当前可用内存 2、cpu使用情况 lscpu //查看os cpu情况 sar -u -f sar文件名 -s hh:mm:ss -e hh:mm:ss //查看对应日期的历史cpu情况 top //查看当前活跃进程使用cpu情况 3、io情况 iostat …...

基于springboot住院管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展&#xff0c;推动了很多行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的线上管理系统。当前的住院管理存在管理效率低下&…...

《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》

导语​ "你是否想过用Python开发一款可玩性高的双人合作游戏&#xff1f;本文将分享如何从零开始实现一款类《吸血鬼幸存者》的生存射击游戏&#xff01;包含完整源码解析、角色系统设计、敌人AI逻辑等核心技术点&#xff0c;文末提供完整代码包下载&#xff01;" 哈…...

【ES6】在ES6中自定义数组

在ES6中是允许自定义类扩展基础类型的&#xff0c;因为这些基础类型是有构造函数的&#xff0c;在JS中类就是函数。 // 自定义数组 class myArray extends Array {constructor() {super();} }let arr new myArray();arr.push(1);console.log(arr);重写Array的原生方法 ES6的…...