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

MongoDB聚合操作

1.聚合操作

聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类:单一作用聚合、聚合管道、MapReduce。

  • 单一作用聚合:提供了对常见聚合过程的简单访问,操作都从单个集合聚合文档。
  • 聚合管道是一个数据聚合的框架,模型基于数据处理流水线的概念。文档进入多级管道,将 文档转换为聚合结果。
  • MapReduce操作具有两个阶段:处理每个文档并向每个输入文档发射一个或多个对象的map阶段,以及reduce组合map操作的输出阶段。

1.1 单一作用聚合

MongoDB提供 db.collection.estimatedDocumentCount(), db.collection.count(), db.collection.distinct() 这类单一作用的聚合函数。 所有这些操作都聚合来自单个集合的文档。虽然这些操作提供了对公共聚合过程的简单访问,但它们缺乏聚合管道和map-Reduce的灵活性和功能。

db.collection.estimatedDocumentCount()

返回集合或视图中所有文档的计数

db.collection.count()

返回与find()集合或视图的查询匹配的文档计数 。等同于 db.collection.find(query).count()构造

db.collection.distinct()

在单个集合或视图中查找指定字段的不同值,并在数组中返回结果。

#检索books集合中所有文档的计数db.books.estimatedDocumentCount()#计算与查询匹配的所有文档db.books.count({favCount:{$gt:50}})#返回不同type的数组db.books.distinct("type")#返回收藏数大于90的文档不同type的数组db.books.distinct("type",{favCount:{$gt:90}})

注意:在分片群集上,如果存在孤立文档或正在进行块迁移,则db.collection.count()没有查询谓词可能导致计数不准确。要避免这些情况,请在分片群集上使用 db.collection.aggregate()方法。

1.2 聚合管道

什么是 MongoDB 聚合框架

MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以:

  1. 作用在一个或几个集合上;
  2. 对集合中的数据进行的一系列运算;
  3. 将这些数据转化为期望的形式;

从效果而言,聚合框架相当于 SQL 查询中的GROUP BY、 LEFT OUTER JOIN 、 AS等。

管道(Pipeline)和阶段(Stage)

整个聚合运算过程称为管道(Pipeline),它是由多个阶段(Stage)组成的, 每个管道:

  1. 接受一系列文档(原始数据);
  2. 每个阶段对这些文档进行一系列运算;
  3. 结果文档输出给下一个阶段;

聚合管道操作语法

pipeline = [$stage1, $stage2, ...$stageN];db.collection.aggregate(pipeline, {options})
  • pipelines 一组数据聚合阶段。除$out、$Merge和$geonear阶段之外,每个阶段都可以在管道中出现多次。
  • options 可选,聚合操作的其他参数。包含:查询计划、是否使用临时文件、 游标、最大操作时间、读写策略、强制索引等等

常用的管道聚合阶段

聚合管道包含非常丰富的聚合阶段,下面是最常用的聚合阶段

阶段

描述

SQL等价运算符

$match

筛选条件

WHERE

$project

投影

AS

$lookup

左外连接

LEFT OUTER JOIN

$sort

排序

ORDER BY

$group

分组

GROUP BY

$skip/$limit

分页

$unwind

展开数组

$graphLookup

图搜索

$facet/$bucket

分面搜索

文档:Aggregation Pipeline Stages — MongoDB Manual

聚合表达式

获取字段信息

$<field> : 用 $ 指示字段路径$<field>.<sub field> : 使用 $ 和 . 来指示内嵌文档的路径

常量表达式

$literal :<value> : 指示常量 <value>

系统变量表达式

$$<variable> 使用 $$ 指示系统变量$$CURRENT 指示管道中当前操作的文档

数据准备

准备数据集,执行脚本

var tags = ["nosql","mongodb","document","developer","popular"];var types = ["technology","sociality","travel","novel","literature"];var books=[];for(var i=0;i<50;i++){var typeIdx = Math.floor(Math.random()*types.length);var tagIdx = Math.floor(Math.random()*tags.length);var tagIdx2 = Math.floor(Math.random()*tags.length);var favCount = Math.floor(Math.random()*100);var username = "xx00"+Math.floor(Math.random()*10);var age = 20 + Math.floor(Math.random()*15);var book = {title: "book-"+i,type: types[typeIdx],tag: [tags[tagIdx],tags[tagIdx2]],favCount: favCount,author: {name:username,age:age}};books.push(book)}db.books.insertMany(books);

$project

投影操作, 将原始字段投影成指定名称, 如将集合中的 title 投影成 name

db.books.aggregate([{$project:{name:"$title"}}])

$project 可以灵活控制输出文档的格式,也可以剔除不需要的字段

db.books.aggregate([{$project:{name:"$title",_id:0,type:1,author:1}}])

从嵌套文档中排除字段

db.books.aggregate([{$project:{name:"$title",_id:0,type:1,"author.name":1}}
])
或者
db.books.aggregate([{$project:{name:"$title",_id:0,type:1,author:{name:1}}}
])

$match

$match用于对文档进行筛选,之后可以在得到的文档子集上做聚合,$match可以使用除了地理空间之外的所有常规查询操作符,在实际应用中尽可能将$match放在管道的前面位置。这样有两个好处:一是可以快速将不需要的文档过滤掉,以减少管道的工作量;二是如果再投射和分组之前执行$match,查询可以使用索引。

db.books.aggregate([{$match:{type:"technology"}}])

筛选管道操作和其他管道操作配合时候时,尽量放到开始阶段,这样可以减少后续管道操作符要操作的文档数,提升效率

db.books.aggregate([{$match:{type:"technology"}},{$project:{name:"$title",_id:0,type:1,author:{name:1}}}])

$count

计数并返回与查询匹配的结果数

db.books.aggregate([{$match:{type:"technology"}},{$count: "type_count"}
])

$match阶段筛选出type匹配technology的文档,并传到下一阶段;

$count阶段返回聚合管道中剩余文档的计数,并将该值分配给type_count

$group

按指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一个阶段。输出文档包含一个_id字段,该字段按键包含不同的组。

输出文档还可以包含计算字段,该字段保存由$group的_id字段分组的一些accumulator表达式的值。 $group不会输出具体的文档而只是统计信息。

{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
  1. _id字段是必填的;但是,可以指定_id值为null来为整个输入文档计算累计值。
  2. 剩余的计算字段是可选的,并使用运算符进行计算。
  3. _id和表达式可以接受任何有效的表达式

accumulator操作符

    名称

描述

类比sql

$avg

计算均值     

avg

$first

返回每组第一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的第一个文档。

limit 0,1

$last

返回每组最后一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的最后个文档。

-

$max

根据分组,获取集合中所有文档对应值得最大值。

max

$min

根据分组,获取集合中所有文档对应值得最小值。

min

$push

将指定的表达式的值添加到一个数组中。

-

$addToSet 

将表达式的值添加到一个集合中(无重复值,无序)。

-

$sum

计算总和

sum

$stdDevPop

返回输入值的总体标准偏差(population standard deviation)

-

$stdDevSamp

返回输入值的样本标准偏差(the sample standard deviation)

-

$group阶段的内存限制为100M。默认情况下,如果stage超过此限制,$group将产生错误。但是,要允许处理大型数据集,请将allowDiskUse选项设置为true以启用$group操作以写入临时文件。

book的数量,收藏总数和平均值

db.books.aggregate([{$group:{_id:null,count:{$sum:1},pop:{$sum:"$favCount"},avg:{$avg:"$favCount"}}}])

统计每个作者的book收藏总数

db.books.aggregate([{$group:{_id:"$author.name",pop:{$sum:"$favCount"}}}])

统计每个作者的每本book的收藏数

db.books.aggregate([{$group:{_id:{name:"$author.name",title:"$title"},pop:{$sum:"$favCount"}}}])

每个作者的book的type合集

db.books.aggregate([{$group:{_id:"$author.name",types:{$addToSet:"$type"}}}])

$unwind

可以将数组拆分为单独的文档

v3.2+支持如下语法:

{$unwind:{#要指定字段路径,在字段名称前加上$符并用引号括起来。path: <field path>,#可选,一个新字段的名称用于存放元素的数组索引。该名称不能以$开头。includeArrayIndex: <string>,  #可选,default :false,若为true,如果路径为空,缺少或为空数组,则$unwind输出文档preserveNullAndEmptyArrays: <boolean>} }

姓名为xx006的作者的book的tag数组拆分为多个文档

db.books.aggregate([{$match:{"author.name":"xx006"}},{$unwind:"$tag"}])db.books.aggregate([{$match:{"author.name":"xx006"}}])

每个作者的book的tag合集

db.books.aggregate([{$unwind:"$tag"},{$group:{_id:"$author.name",types:{$addToSet:"$tag"}}}])

案例

示例数据

db.books.insert([{"title" : "book-51","type" : "technology","favCount" : 11,"tag":[],"author" : {"name" : "fox","age" : 28}},{"title" : "book-52","type" : "technology","favCount" : 15,"author" : {"name" : "fox","age" : 28}},{"title" : "book-53","type" : "technology","tag" : ["nosql","document"],"favCount" : 20,"author" : {"name" : "fox","age" : 28}}])

测试

# 使用includeArrayIndex选项来输出数组元素的数组索引includeArrayIndex选项来输出数组元素的数组索引db.books.aggregate([{$match:{"author.name":"fox"}},{$unwind:{path:"$tag", includeArrayIndex: "arrayIndex"}}])# 使用preserveNullAndEmptyArrays选项在输出中包含缺少size字段,null或空数组的文档db.books.aggregate([{$match:{"author.name":"fox"}},{$unwind:{path:"$tag", preserveNullAndEmptyArrays: true}}])

$limit

限制传递到管道中下一阶段的文档数

db.books.aggregate([{$limit : 5 }])

此操作仅返回管道传递给它的前5个文档。 $limit对其传递的文档内容没有影响。

注意:当$sort在管道中的$limit之前立即出现时,$sort操作只会在过程中维持前n个结果,其中n是指定的限制,而MongoDB只需要将n个项存储在内存中。

$skip

跳过进入stage的指定数量的文档,并将其余文档传递到管道中的下一个阶段

db.books.aggregate([ {$skip : 5 }])

此操作将跳过管道传递给它的前5个文档。 $skip对沿着管道传递的文档的内容没有影响。

$sort

对所有输入文档进行排序,并按排序顺序将它们返回到管道。

语法:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

要对字段进行排序,请将排序顺序设置为1或-1,以分别指定升序或降序排序,如下例所示:

db.books.aggregate([{$sort : {favCount:-1,title:1}}
])

$lookup

Mongodb 3.2版本新增,主要用来实现多表关联查询, 相当关系型数据库中多表关联查询。每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组(可根据需要命名新key )。数组列存放的数据是来自被Join集合的适配文档,如果没有,集合为空(即 为[ ])

语法:

db.collection.aggregate([{$lookup: {from: "<collection to join>",localField: "<field from the input documents>",foreignField: "<field from the documents of the from collection>",as: "<output array field>"}})

from

同一个数据库下等待被Join的集合。

localField

源集合中的match值,如果输入的集合中,某文档没有 localField

这个Key(Field),在处理的过程中,会默认为此文档含

有 localField:null的键值对。

foreignField

待Join的集合的match值,如果待Join的集合中,文档没有foreignField

值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对。

as

为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉

注意:null = null 此为真

其语法功能类似于下面的伪SQL语句:

SELECT *, <output array field>FROM collectionWHERE <output array field> IN (SELECT *FROM <collection to join>WHERE <foreignField>= <collection.localField>);

案例

数据准备

db.customer.insert({customerCode:1,name:"customer1",phone:"13112345678",address:"test1"})db.customer.insert({customerCode:2,name:"customer2",phone:"13112345679",address:"test2"})db.order.insert({orderId:1,orderCode:"order001",customerCode:1,price:200})db.order.insert({orderId:2,orderCode:"order002",customerCode:2,price:400})db.orderItem.insert({itemId:1,productName:"apples",qutity:2,orderId:1})db.orderItem.insert({itemId:2,productName:"oranges",qutity:2,orderId:1})db.orderItem.insert({itemId:3,productName:"mangoes",qutity:2,orderId:1})db.orderItem.insert({itemId:4,productName:"apples",qutity:2,orderId:2})db.orderItem.insert({itemId:5,productName:"oranges",qutity:2,orderId:2})db.orderItem.insert({itemId:6,productName:"mangoes",qutity:2,orderId:2})

关联查询

db.customer.aggregate([        {$lookup: {from: "order",localField: "customerCode",foreignField: "customerCode",as: "customerOrder"}}])db.order.aggregate([{$lookup: {from: "customer",localField: "customerCode",foreignField: "customerCode",as: "curstomer"}},{$lookup: {from: "orderItem",localField: "orderId",foreignField: "orderId",as: "orderItem"}}])

聚合操作案例1

统计每个分类的book文档数量

db.books.aggregate([{$group:{_id:"$type",total:{$sum:1}}},{$sort:{total:-1}}])

标签的热度排行,标签的热度则按其关联book文档的收藏数(favCount)来计算

db.books.aggregate([{$match:{favCount:{$gt:0}}},{$unwind:"$tag"},{$group:{_id:"$tag",total:{$sum:"$favCount"}}},{$sort:{total:-1}}])
  1. $match阶段:用于过滤favCount=0的文档。
  2. $unwind阶段:用于将标签数组进行展开,这样一个包含3个标签的文档会被拆解为3个条目。
  3. $group阶段:对拆解后的文档进行分组计算,$sum:"$favCount"表示按favCount字段进行累加。
  4. $sort阶段:接收分组计算的输出,按total得分进行排序。

统计book文档收藏数[0,10),[10,60),[60,80),[80,100),[100,+∞)

db.books.aggregate([{$bucket:{groupBy:"$favCount",boundaries:[0,10,60,80,100],default:"other",output:{"count":{$sum:1}}}}])

聚合操作案例2

导入邮政编码数据集:https://media.mongodb.org/zips.json

资源如上

使用mongoimport工具导入数据

mongoimport -h 192.168.65.174 -d test -u fox -p fox --authenticationDatabase=admin -c zips --file D:\ProgramData\mongodb\import\zips.json

h,--host :代表远程连接的数据库地址,默认连接本地Mongo数据库;

--port:代表远程连接的数据库的端口,默认连接的远程端口27017;

-u,--username:代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;

-p,--password:代表连接数据库的账号对应的密码;

-d,--db:代表连接的数据库;

-c,--collection:代表连接数据库中的集合;

-f, --fields:代表导入集合中的字段;

--type:代表导入的文件类型,包括csv和json,tsv文件,默认json格式;

--file:导入的文件名称

--headerline:导入csv文件时,指明第一行是列名,不需要导入;

返回人口超过1000万的州

db.zips.aggregate( [{ $group: { _id: "$state", totalPop: { $sum: "$pop" } } },{ $match: { totalPop: { $gte: 10*1000*1000 } } }] )

这个聚合操作的等价SQL是:

SELECT state, SUM(pop) AS totalPopFROM zipsGROUP BY stateHAVING totalPop >= (10*1000*1000)

返回各州平均城市人口

db.zips.aggregate( [{ $group: { _id: { state: "$state", city: "$city" }, cityPop: { $sum: "$pop" } } },{ $group: { _id: "$_id.state", avgCityPop: { $avg: "$cityPop" } } }] )db.zips.aggregate( [{ $group: { _id: { state: "$state", city: "$city" }, cityPop: { $sum: "$pop" } } }] )

按州返回最大和最小的城市

db.zips.aggregate( [{ $group:{_id: { state: "$state", city: "$city" },pop: { $sum: "$pop" }}},{ $sort: { pop: 1 } },{ $group:{_id : "$_id.state",biggestCity:  { $last: "$_id.city" },biggestPop:   { $last: "$pop" },smallestCity: { $first: "$_id.city" },smallestPop:  { $first: "$pop" }}},{ $project:{ _id: 0,state: "$_id",biggestCity:  { name: "$biggestCity",  pop: "$biggestPop" },smallestCity: { name: "$smallestCity", pop: "$smallestPop" }}}] )

1.3 MapReduce

MapReduce操作将大量的数据处理工作拆分成多个线程并行处理,然后将结果合并在一起。MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。

MapReduce具有两个阶段:

  1. 将具有相同Key的文档数据整合在一起的map阶段
  2. 组合map操作的结果进行统计输出的reduce阶段

MapReduce的基本语法

db.collection.mapReduce(function() {emit(key,value);},  //map 函数function(key,values) {return reduceFunction},   //reduce 函数{out: <collection>,query: <document>,sort: <document>,limit: <number>,finalize: <function>,scope: <document>,jsMode: <boolean>,verbose: <boolean>,bypassDocumentValidation: <boolean>})
  1. map,将数据拆分成键值对,交给reduce函数
  2. reduce,根据键将值做统计运算
  3. out,可选,将结果汇入指定表
  4. quey,可选筛选数据的条件,筛选的数据送入map
  5. sort,排序完后,送入map
  6. limit,限制送入map的文档数
  7. finalize,可选,修改reduce的结果后进行输出
  8. scope,可选,指定map、reduce、finalize的全局变量
  9. jsMode,可选,默认false。在mapreduce过程中是否将数 据转换成bson格式。
  10. verbose,可选,是否在结果中显示时间,默认false
  11. bypassDocmentValidation,可选,是否略过数据校验

统计type为travel的不同作者的book文档收藏数

db.books.mapReduce(function(){emit(this.type,this.favCount)},function(key,values){return Array.sum(values)},{query:{type:"travel"},out: "books_favCount"})

从MongoDB 5.0开始,map-reduce操作已被弃用。聚合管道比映射-reduce操作提供更好的性能和可用性。Map-reduce操作可以使用聚合管道操作符重写,例如$group、$merge等。

相关文章:

MongoDB聚合操作

1.聚合操作 聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档&#xff0c;可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类&#xff1a;单一作用聚合、聚合管道、MapReduce。 单一作用聚合&#xff1a;提供了对常见聚合过程的简单访问&#xff0c…...

第二十三周周报:High-fidelity Person-centric Subject-to-Image Synthesis

目录 摘要 Abstract TDM SDM SNF 测试时的人物细节捕捉 主要贡献 总结 摘要 本周阅读了一篇2024年CVPR的关于高保真度、以人物为中心的图像合成方法的论文&#xff1a;High-fidelity Person-centric Subject-to-Image Synthesis。该论文提出了一种名为Face-diffuser的…...

Cesium 与 Leaflet:地理信息可视化技术比较

在现代地理信息系统(GIS)和空间数据可视化领域,Cesium 和 Leaflet 是两种非常常见的地理可视化库,它们各自适用于不同的应用场景。Cesium 专注于三维地球视图和复杂空间分析,而 Leaflet 则注重轻量级的二维地图展示。本文将对这两种技术进行详细的对比,帮助开发者根据具体…...

Linux 服务器使用指南:诞生与演进以及版本(一)

一、引言 在当今信息技术的浪潮中&#xff0c;Linux 操作系统无疑是一个关键的支柱&#x1f60e;。无论是在服务器管理、软件开发还是大数据处理领域&#xff0c;Linux 都以其卓越的适应性和优势脱颖而出&#x1f44d;。然而&#xff0c;对于许多新手而言&#xff0c;Linux 系统…...

龙蜥 Linux 安装 JDK

龙蜥 Linux 安装 JDK 下载安装解压到目标路径设置环境变量直接在启动脚本中临时设置 参考资料 下载 这个就不赘述了&#xff0c;参考资料中的另外两篇安装帖&#xff0c;都有。 如果不能上网&#xff0c;也可以去内网其他之前装过JDK的服务器&#xff0c;直接复制过来。 tar …...

Python小白语法基础20(模块与包)

0) 参考文章 python的模块(module)、包(package)及pip_python package-CSDN博客Python之函数、模块、包库_python函数、模块和包-CSDN博客Python函数模块自定义封装及模块嵌套导入&#xff08;手把手教程&#xff09;_python如何封装一个模块-CSDN博客 1) 模块与包说明 软件…...

详解 Qt QtPDF之QPdfPageNavigator 页面跳转

文章目录 前言头文件&#xff1a; 自 Qt 6.4 起继承自&#xff1a; 属性backAvailable : const boolcurrentLocation : const QPointFcurrentPage : const intcurrentZoom : const qrealforwardAvailable : const bool 公共函数QPdfPageNavigator(QObject *parent)virtual ~QPd…...

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析

目录 一、序列标注&#xff08;Sequence Tagging&#xff09;二、命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&#xff09;**命名实体识别的作用****命名实体识别的常见实体类别** &#xff1a; 三、标签类型四、序列标注的三种常见方法1. **BIO&#xf…...

【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现

代码主要实现了以下功能&#xff1a; 二叉树相关数据结构定义 定义了二叉树节点结构体 BiTNode&#xff0c;包含节点数据值&#xff08;字符类型&#xff09;以及指向左右子树的指针。 定义了顺序栈结构体 SqStack&#xff0c;用于存储二叉树节点指针&#xff0c;实现非递归遍历…...

2024年11月文章一览

2024年11月编程人总共更新了21篇文章&#xff1a; 1.2024年10月文章一览 2.《使用Gin框架构建分布式应用》阅读笔记&#xff1a;p307-p392 3.《使用Gin框架构建分布式应用》阅读笔记&#xff1a;p393-p437 4.《使用Gin框架构建分布式应用》读后感 5.《Django 5 By Example…...

重生之我在异世界学编程之C语言:二维数组篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 二维数组的创建1. 二维数组的…...

和鲸科技创始人CEO范向伟出席首届工业智算产业发展研讨会,共话 AI 创新与产业化落地

11 月 22 日&#xff0c;首届工业智算产业发展研讨会在中国工业互联网研究院召开。工业和信息化部党组成员、副部长单忠德&#xff0c;国家信息中心大数据发展部副主任魏颖出席会议并致辞。中国工程院院士、北京化工大学教授高金吉&#xff0c;工业和信息化部信息通信发展司二级…...

postgres数据备份与主从配置

备份PostgreSQL数据库 备份格式有几种选择&#xff1a; bak&#xff1a;压缩二进制格式 sql&#xff1a;明文转储 tar: tarball mydb# \q -bash-4.2$ pg pgawk pg_dump pgrep pg_basebackup pg_dumpall pg_restore# 备份所有的 -bash-4.2$ pg_dumpall &…...

【二分查找】力扣 275. H 指数 II

一、题目 二、思路 h 指数是高引用引用次数&#xff0c;而 citations 数组中存储的就是不同论文被引用的次数&#xff0c;并且是按照升序排列的。也就是说 h 指数将整个 citations 数组分成了两部分&#xff0c;左半部分是不够引用 h 次 的论文&#xff0c;右半部分论文的引用…...

使用uni-app进行开发前准备

使用uni-app进行开发&#xff0c;需要遵循一定的步骤和流程。以下是一个详细的指南&#xff0c;帮助你开始使用uni-app进行开发&#xff1a; 一、开发环境搭建 安装Node.js&#xff1a; 首先&#xff0c;从Node.js的官方网站&#xff08;https://nodejs.org/&#xff09;下载并…...

AI开发-深度学习框架-PyTorch-torchnlp

1 需求 Welcome to Pytorch-NLP’s documentation! — PyTorch-NLP 0.5.0 documentation 2 接口 3 示例 4 参考资料...

VBA数据库解决方案第十七讲:Recordset对象记录位置的定位方法

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

Ubuntu 操作系统

一、简介 Ubuntu 是一个基于 Linux 的开源操作系统&#xff0c;它由 Canonical Ltd. 公司维护和资助。Ubuntu 以其易用性、强大的社区支持和定期的安全更新而闻名&#xff0c;一个一桌面应用为主的操作系统。 二、用户使用 1、常规用户的登陆方式 在登录时一般使用普通用户&…...

Maven 内置绑定到底怎么回事?

Maven是一个很好的项目管理工具. 一方面有着众多脚手架&#xff0c;另一方面在依赖管理方面 帮助使用者做了很多准备工作. 随着Maven的使用和学习的深入&#xff0c;大家会不仅有一些问题。 比较浅显的一个就是&#xff0c; 日常我们的Maven 下载安装好以后&#xff0c;在IDE 里…...

如何把Qt exe文件发送给其他人使用

如何把Qt exe文件发送给其他人使用 1、先把 Debug改成Release2、重新构建项目3、运行项目4、找到release文件夹5、新建文件夹&#xff0c;存放exe文件6、打开qt控制台串口7、下载各种文件8、压缩&#xff0c;发送压缩包给别人 1、先把 Debug改成Release 2、重新构建项目 3、运行…...

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…...

定义函数合并字符串—超详细讲解

【问题描述】 编写一个函数void str_bin(char str1[ ], char str2[ ])&#xff0c; str1、str2是两个有序字符串&#xff08;其中字符按ASCII码从小到大排序&#xff09;&#xff0c;将str2合并到字符串str1中&#xff0c;要求合并后的字符串仍是有序的&#xff0c;允许字符重…...

实现 vue3 正整数输入框组件

1.实现代码 components/InputInteger.vue <!-- 正整数输入框 --> <template><el-input v-model"_value" input"onInput" maxlength"9" clearable /> </template><script lang"ts" setup> import { ref …...

Leetcode - 周赛425

目录 一&#xff0c;3364. 最小正和子数组 二&#xff0c; 3365. 重排子字符串以形成目标字符串 三&#xff0c;3366. 最小数组和 四&#xff0c;3367. 移除边之后的权重最大和 一&#xff0c;3364. 最小正和子数组 本题可以直接暴力枚举&#xff0c;代码如下&#xff1a; …...

c++(斗罗大陆2)

我把魂力等级更新到了31级 #include<iostream> #include<conio.h> #include<windows.h> #include<stdlib.h> #include<stdio.h> #include<time.h> #include<string.h> using namespace std; int qs10; int xthl0;//先…...

redis常见数据类型

Redis是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理&#xff0c;支持多种数据类型。 一、数据类型介绍 String&#xff08;字符串&#xff09; Redis中最基本的数据类型。可以存储任何类型的数据&#xff0c;包括字符串、数字和二进制…...

MySQL - 性能优化

使用 Explain 进行分析 Explain 用来分析 SELECT 查询语句&#xff0c;开发人员可以通过分析 Explain 结果来优化查询语句。 比较重要的字段有: select_type : 查询类型&#xff0c;有简单查询、联合查询、子查询等 key : 使用的索引 rows : 扫描的行数 type &#xff1a;…...

Linux进程概念-详细版(一)

目录 进程概念 描述进程-PCB task_struct-PCB的一种 task_struct内容分类 查看进程 通过系统目录查看 通过ps命令查看 通过系统调用获取进程的PID和PPID 通过系统调用创建进程 fork的认识 使用if进行分流 最后的总结 Linux进程状态 运行状态-R 浅度睡眠状态-S 深度睡…...

K8S网络系列--Flannel网络下UDP、VXLAN模式的通信流程机制分析

文章目录 前言一、了解overlay、underlay容器网络二、网络通信1.分类2.网络虚拟设备对2.1、什么是网络虚拟设备对veth pair?2.2、如何查看容器的网卡与主机的哪个veth设备对是成对的关系? 3、vxlan和vtep3.1、vtep3.2、vxlan相关概念 三、Flannel网络模式剖析0、flannel的作用…...

ThreadLocal的设计思考

问题的提出 在Java多线程中&#xff0c;共享变量的读写非常容易出现不可预测的行为&#xff0c;因此对共享变量的访问控制非常重要。因此在多线程编程时&#xff0c;为了保证线程安全&#xff0c;需要进行额外的同步措施。比如典型的操作就是加锁。除了加锁外&#xff0c;另一…...

小程序推广app/网络推广seo

简单工厂模式&#xff1a;简单工厂模式是属于创建型模式&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族…...

qq空间怎么做网站/网站建设公司seo关键词

1.定时器 2.websocket,可以被动的接受后台数据&#xff0c;用回调函数响应&#xff08;http://www.runoob.com/html/html5-websocket.html&#xff09;...

印度做网站/网络销售公司经营范围

接下来就是我要介绍的论文Zhou D, Frmont V, Quost B, et al. Moving Object Detection and Segmentation in Urban Environments from a Moving Platform ☆[J]. Image & Vision Computing, 2017, 68.这是一篇2017 的论文&#xff0c;发表在HAL&#xff0c;HAL is a multi…...

wordpress 每日一文/品牌推广策略与方式

阿里西西 标准之路转载于:https://www.cnblogs.com/Peter-Youny/archive/2012/08/10/2632035.html...

网站商城系统建设/雷神代刷推广网站

点击上方“iOS开发”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; 我是照骗 前言 最近逛博客看到了一篇帖子&#xff0c;里面介绍了自己如何设计一套星球大战主题的UI&#xff0c;里面有一个界面破碎的特效&#xff0c;看着很炫酷&#xff0…...

php mysql开发网站开发/百度竞价员

Ubuntu20.04 ROS1. 环境配置2. 创建工作空间3. URDF 机器人建模4. 机器人仿真4.1 机器人 URDF 模型优化4.2 Arbotix rviz 功能仿真4.2.1 配置 Arbotix 控制器4.2.2 导航仿真示例4.3 Gazebo 物理仿真环境搭建1. 环境配置 虚拟机 VMware 安装网址&#xff1a; vmap.sjtu.edu.c…...