MongoDB之概述、命令

基础知识

是什么

概念

分布式文件存储数据库,提供高可用、可扩展、易部署的数据存储解决方案。

结构

image.png

BSON存储类型

类似JSON的一种二进制存储格式。相比于JSON,提供更丰富的类型支持。
优点是灵活,缺点是空间利用率不佳。

类型说明解释举例
String字符串UTF-8编码为合法字符串。{name:“李四”}
Integer整型根据服务器可分为32、64位。{age:1}
Boolean布尔值{flag:true}
Double双精度浮点值{number:3.14}
ObjectId对象ID用于创建文档的ID{_id:new Object()}
Array数组{top:[85,63,42]}
Timestamp时间戳{ ts: new Timestamp() }
Object内嵌文档{obj:{age:18}}
Null空值空值或未定义的对象{key:null}
Date或者 ISODate格林尼治 时间日期时间,用Unix日期格 式来存储当前日 期或时 间。{birth:new Date()}
Code代码可包含js代码{x:function(){}}

其它特殊类型File:

  • 二进制转码小于16M,可用 Base64 存储。
  • 二进制转码大于16M,可用 GridFS 存储。

什么时候使用MongoDB

应用特征

应用特征
不需要事务
不需要复杂join
新应用,需求变动,数据模型无法确定,需要快速迭代开发
应用需要2000以上QPS
应用需要TB、PB级别的数据存储
应用发展迅速,需要快速水平扩展
要求数据不丢失
应用需要99.999%高可用
应用需要大量地理位置查询、文本查询

适用场景

  • 网站数据:适合实时插入、更新、查询,并要求具备复制、高度伸缩性。
  • 缓存:高性能,可作为基础信息设置的缓存层。
  • 存储大尺寸、低价值的数据
  • 高伸缩场景。合适组成几十上百的数据库集群。内置高可用解决方案以及MapReduce引擎。
  • 用于对象、JSON数据的存储。BSON格式合适文档化格式的存储和查询。

行业应用场景

  • 游戏场景。用户信息、装备信息、积分等,内嵌文档存储,方便查询、更新。
  • 物流场景。存储订单信息,通过内嵌文档形式,一下子就可以把订单的所有变更信息查询出来。
  • 社交场景。存储用户信息、朋友圈,查找附近的人等。
  • 物联网场景。存储设备的接入信息,以及设备上报的日志。
  • 直播。用户信息、礼物信息。

GUI工具

MongoDB Compass Community

  • MongoDB提供GUI MongoDB工具
  • 借助内置模式可视化,用户可以分析文档并显示丰富的结构。为了监控服务器的负载,它提供了数据库操作的实时统计信息
  • Compass有两个版本:Enterprise(付费),Community(免费)
  • 适用于Linux,Mac或Windows

MongoBooster

  • 是MongoDB CLI界面中非常流行的GUI工具。它正式名称为MongoBooster
  • NoSQLBooster是一个跨平台,它带有一堆MongoDB 工具来管理数据库和监控服务器
  • 这个Mongodb工具包括服务器监控工具,Visual Explain Plan,查询构建器,SQL查询,
  • ES2017语法支持等等…
  • 适用于Linux,Mac或Windows

Navicat

基础命令

连接

mongo --username root --password  --host localhost --port 27017

数据库

当前数据库

db

所有数据库

show dbs
show databases

切换数据库

use <database>

创建数据库

use <newDatabaseName>

删除当前数据库

db.dropDatabase()

集合操作

所有集合(表)

show collections
show tables

查看集合命令帮助

db.<collection>.help()

删除集合

db.<collection>. drop()

插入操作

单条插入

db.<collection>.insertOne(
{xm:"张三",age:23}
)

db.myt.insertOne(
{xm:"张三",age:23}
)

多条插入

db.<collection>.insertMany([
  {xxx},
  {xxx}
])

db.myt.insertMany([
  {xm:"李四",age:24},
  {xm:"王五",age:25},
  {xm:"赵六",age:26},
  {xm:"李四",age:34},
  {xm:"王五",age:35},
  {xm:"赵六",age:36}
])


查询操作

基础查询

操作格式对比
={key:value}where a = 1
>{key:{$gt:value}}where a > 1
<{key:{$lt:value}}where a < 1
>={key:{$gte:value}}where a >= 1
<={key:{$lte:value}}where a <= 1
!={key:{$ne:value}}where a != 1
等值查询

db.<collection>.find({<field>:<value>})
db.myt.find({xm:"张三"})

IN查询

db.<collection>.find({<field>:{<option>:<value>}})
db.myt.find({xm:{$in:["张三","李四"]}})

AND查询

db.<collection>.find({<field>:<value>,<field>:<value>})
db.myt.find({xm:"李四", age:34})
db.myt.find({xm:"李四", age:{$gt:30}})

范围查询

db.myt.find({xm:"李四", age:{$gt:30}})

OR查询

db.<collection>.find({$or:[{<field>:<value>},{<field>:<value>}]})
db.myt.find( {$or: [ {xm: "李四"}, {age: {$lt: 26}} ] } )

AND+OR查询

db.<collection>.find({<field>:<value>, $or:[{<field>:<value>},{<field>:<value>}]})

类似于:select * from t where a = 1 and ( b = 1 or b = 2)

db.myt.find( { xm:"李四", $or:[{age:{$lt: 25}},{age:35}] } )

!=查询

db.<collection>.find({<field>:{$ne:<value>}})
db.myt.find({xm:{$ne:"李四"}})

分页查询

db.<collection>.find().sort({<排序列>:<排序方式>}).limit(单页数)
升序:db.myt.find().sort({age:1}).limit(3)
降序:db.myt.find().sort({age:-1}).limit(3)

数组查询

等值查询

db.myt.insertOne( {xm:"孙八",age:28,size:{h:165,w:54},tags:["家财万贯","不惑之年"]} )
db.myt.find({tags:["家财万贯","不惑之年"]})

包含查询

db.myt.find({tags:{$all:["家财万贯"]}})

在指定下标下进行查询

db.myt.find( {"tags.2":{$lt:65}} )

db.myt.insertMany([
  {xm:"李四",age:43, size:{h:165,w:54}, tags:["不惑之年","家财万贯", 78]},
	{xm:"王五",age:61, size:{h:167,w:56}, tags:["花甲","家财万贯", 65]},
  {xm:"赵六",age:54, size:{h:174,w:64}, tags:["知天命", 59]},
])
数组长度等于n的文档

db.myt.find( {tags:{$size:3}} )

查询null或者丢失的字段

db.myt.find( {tags: null} )

删除操作

删除所有

db.myt.deleteMany({})

按条件删除

db.<collection>.deleteMany( { <field1>: { <operator1>: <value1> }, ... } )
db.my2.deleteMany( {xm:"王五"})

只删除一个符合条件的

db.<collection>.deleteOne( { <field>: <value> } )
db.my2.deleteOne( {xm:"李四"} )

更新操作

更新格式

db.集合名.update(
  <query>,
  <update>,
  {
  upsert: <boolean>,
  multi: <boolean>,
  writeConcern: <document>
  }
)

-- 更新一个
updateOne()
-- 更新所有符合条件的
updateMany()
-- 文档替换。多个匹配结果也只替换一个。
replaceOne()
  • query:查询条件
  • update:set操作,包括:
    • $set:设置字段值。
    • $unset :删除指定字段。
    • $inc :增加指定数值。
  • upsert(可选):默认false。不存在更新的记录时是否新增。
  • multi (可选):默认false。只更新找到的第一条记录。
  • writeConcern (可选):指定写操作的回执行为。如 写操作是否需要确认。包括 { w: <value>, j:<boolean> , wtimeout: <number>}字段。
    • w :默认1。
      • n:指定写操作传播到的成员数量,即比如 写操作 要求得到n个MongoDB实例或副本集的主要成员的确认。
      • 0:不要求确认写操作。
      • " majority":要求写操作得到大多数成员( members[n].votes 值大于0的成员 )的确认。
    • j:确认写操作是否写入硬盘日志。确认的数量由w值来指定。
    • wtimeout :指定write concern的时间限制,w > 1时生效。
      • 超过指定时间之后,写操作返回error,不管最后是否执行成功;超时之前的成功操作的数据也不会撤销。
      • 未指定 或值为 0 时不会限制时间,写操作将无限制等待。

符号对照表

字段运算符说明
$currentDate将指定字段的值设置为当前日期
$inc增加指定数值
$min字段值小于指定值才更新
$max字段值大于指定值才更新
$mul字段值与指定值相乘
$rename重命名字段
$set设置字段值
$setOnInsert如果更新操作导致插入文档,则设置指定字段的值。单纯的修改无影响。
$unset删除指定字段
数值运算符说明
$充当占位符。更新与查询条件匹配的第一个元素。
$[]充当占位符。更新数组中与查询条件匹配的文档中的所有元素
$addToSet只有元素不在数组中时才添加到数组。
$pop删除数组第一或最后一个元素
$pull删除符合匹配条件的所有元素
$push添加元素到数组
$pullAll删除数组中所有匹配的元素
修饰符说明
$each遍历
$position指定下标
$slice
$sort

注意点

  • 写操作在单一文档上是原子性。
  • 设定 _id 之后不要更新。

更新案例

db.my2.update( 
  {xm:"李四"}, 
  { 
    $set:{age:25}, 
    $currentDate:{lastModified:true} 
  }
)
-- 注:当前日期写入到lastModified字段,字段不存在则创建
db.my2.update( 
  {xm:"李四"}, 
  { 
    $set:{age:25}, 
    $currentDate:{lastModified:true} 
  },
  { multi: true }
)

文档替换

db.my2.replaceOne( 
  {xm:"王五"}, 
  {xm:"王五", age:34,size:{h:168,w:62}} 
)

聚合操作

聚合操作分类

聚合管道
文档进入多阶段的管道,这些文档将转化为聚合结果。

db.orders.aggregate([
   { $match: { status: "A" } }, -- 一阶段
   { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }  -- 二阶段
])

Map-Reduce
image.png
单用途聚合操作
image.png

测试数据

-- 测试数据:
db.authors.insertMany([
  { "author" : "Vincent", "title" : "Java Primer", "like" : 10 },
  { "author" : "Vincent", "title" : "Java Primer", "like" : 10 },
  { "author" : "della", "title" : "iOS Primer", "like" : 30 },
  { "author" : "benson", "title" : "Android Primer", "like" : 20 },
  { "author" : "Vincent", "title" : "Html5 Primer", "like" : 40 },
  { "author" : "louise", "title" : "Go Primer", "like" : 30 },
  { "author" : "yilia", "title" : "Swift Primer", "like" : 8 }
])

单目的聚合操作

单目的聚合命令常用的有:count()distinct() group()

db.authors.find({like:{$lt:20}}).count()
db.authors.distinct("like")


聚合管道操作

格式说明

一般用于统计数据。常用操作:

  • $match :过滤数据。
  • $project :修改传入文档的结构。可用于重命名、增加、删除域、创建计算结果和嵌套文档。
  • $group :集中文档,统计结果。
  • $sort :排序。
  • $limit :限制返回的结果数。
db.authors.aggregate([
    { $match: { status: "A" } },
    { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

-- like、author为字段名称
db.authors.aggregate([
  	{ $match: { author: {$in:["louise", "della"]} } },
    { $group: { _id: "$like", total: { $sum: "$like" } } }
])
筛选
db.authors.aggregate(
	{"$match": {"like": {"$gt" : 10} }}
)
分组
-- _id 、count 对应 select user_id as id , sum(xxx) as count
db.authors.aggregate(
  {"$match": {"like": {"$gte" : 25} }},
  {"$group": {"_id": "$author", "count": {"$sum": 1}}}
)
多字段分组
db.authors.aggregate(
  {"$match": {"like": {"$gte" : 25} }},
  {"$group": {"_id": {a:"$author",b:"$like"}, "count": {"$sum": 1}}}
)
分组取最值
db.authors.aggregate(
	{"$group": {"_id": "$author", "count": {"$max": "$like"}}}
)
分组取平均值
db.authors.aggregate(
	{"$group": {"_id": "$author", "count": {"$avg": "$like"}}}
)

分组结果写入Set集合
-- 根据author字段分组,分组结果写入名为like的集合
db.authors.aggregate(
	{"$group": {"_id": "$author", "like": {"$addToSet": "$like"}}}
)

{ "_id" : "Vincent", "like" : [ 40, 10 ] }
{ "_id" : "yilia", "like" : [ 8 ] }
{ "_id" : "della", "like" : [ 30 ] }
{ "_id" : "benson", "like" : [ 20 ] }
{ "_id" : "louise", "like" : [ 30 ] }


分组结果写入List集合
db.authors.aggregate(
	{"$group": {"_id": "$author", "like": {"$push": "$like"}}}
)
{ "_id" : "Vincent", "like" : [ 10, 40, 10 ] }
{ "_id" : "yilia", "like" : [ 8 ] }
{ "_id" : "della", "like" : [ 30 ] }
{ "_id" : "benson", "like" : [ 20 ] }
{ "_id" : "louise", "like" : [ 30 ] }
$project案例:结果中排除字段、字段重命名

0不显示此字段、1显示此字段。

-- 结果集不显示_id字段
db.authors.aggregate(
  {"$match": {"like": {"$gte" : 10} }},
  {"$project": {"_id": 0, "author":1, "title": 1}}
)

-- 重命名
db.authors.aggregate(
  {"$match": {"like": {"$gte" : 10} }},
  {"$project": {"_id": 0, "author":1, "B-Name": "$title"}}
)
$limit案例、排序
db.authors.aggregate(
  {"$match": {"like": {"$gte" : 10} }},
  {"$group": {"_id": "$author", "count": {"$sum": 1}}},
  {"$sort": {"count": -1}},
  {"$limit": 1}
)
算数表达式案例
add 指定字段值加 n
-- like字段值 + 1
db.authors.aggregate(
	{"$project": {"newLike": {"$add": ["$like", 1]}}}
)

{ "_id" : ObjectId("63b2b63e653186ee23d724b3"), "newLike" : 11 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b4"), "newLike" : 31 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b5"), "newLike" : 21 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b6"), "newLike" : 41 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b7"), "newLike" : 31 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b8"), "newLike" : 9 }
{ "_id" : ObjectId("63b2d5a7653186ee23d724b9"), "newLike" : 11 }
subtract 指定字段值减 n
db.authors.aggregate(
{"$project": {"newLike": {"$subtract": ["$like", 2]}}}
)

{ "_id" : ObjectId("63b2b63e653186ee23d724b3"), "newLike" : 8 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b4"), "newLike" : 28 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b5"), "newLike" : 18 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b6"), "newLike" : 38 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b7"), "newLike" : 28 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b8"), "newLike" : 6 }
{ "_id" : ObjectId("63b2d5a7653186ee23d724b9"), "newLike" : 8 }
multiply 乘法
db.authors.aggregate(
	{"$project": {"newLike": {"$multiply": ["$like", 10]}} }
)

{ "_id" : ObjectId("63b2b63e653186ee23d724b3"), "newLike" : 100 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b4"), "newLike" : 300 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b5"), "newLike" : 200 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b6"), "newLike" : 400 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b7"), "newLike" : 300 }
{ "_id" : ObjectId("63b2b63e653186ee23d724b8"), "newLike" : 80 }
{ "_id" : ObjectId("63b2d5a7653186ee23d724b9"), "newLike" : 100 }
divide 除法
db.authors.aggregate(
	{"$project": {"newLike": {"$divide": ["$like", 10]}} }
)
mod 余数
db.authors.aggregate(
	{"$project": {"newLike": {"$mod": ["$like", 3]}} }
)

substr 字符串截取
db.authors.aggregate(
	{"$project": {"newTitle": {"$substr": ["$title", 1, 2] } }}
)

concat 字符串拼接
db.authors.aggregate(
	{"$project": {"newTitle": {"$concat": ["$title", "(", "$author", ")"] }
}}
)
toLower 字符串转大、小写
db.authors.aggregate(
	{"$project": {"newTitle": {"$toLower": "$title"} }}
)
-- 大写
db.authors.aggregate(
	{"$project": {"newAuthor": {"$toUpper": "$author"} }}
)
日期表达式案例

获取日期任意一部分
$year、$month、$dayOfMonth、$dayOfWeek、$dayOfYear、$hour、$minute、$second

-- 给示例数据补充字段
db.authors.update(
  {},
  {"$set": {"publishDate": new Date()}},
  true,
  true
)
-- 查询月份
db.authors.aggregate(
{"$project": {"month": {"$month": "$publishDate"}}}
)

运算符案例
cmp 大小比较

$cmp: [exp1, exp2]

  • 等于返回 0
  • 小于返回一个负数
  • 大于返回一个正数
db.authors.aggregate(
	{"$project": {"result": {"$cmp": ["$like", 20]} }}
)
and 条件

$and:[exp1, exp2, ..., expN]
多个条件都为true时才返回true。

db.authors.aggregate(
  {"$project": 
		{
      "result": {
				"$and": [{"$eq": ["$author", "Vincent"]}, {"$gt":["$like", 20]}]
			}
		}
  }
)

or 条件
db.authors.aggregate(
  {
    "$project": 
    {
      "result": 
      {
        "$or": [{"$eq": ["$author", "Vincent"]}, {"$gt": ["$like",20]}]
      }
    }
  }
)
not 不等于
db.authors.aggregate(
	{"$project": {"result": {"$not": {"$eq": ["$author", "Vincent"]}}}}
)

cond 三元运算符

$cond: [booleanExp, trueExp, falseExp]

db.authors.aggregate(
  {"$project": {
    "result": {"$cond": [ {"$eq": ["$author", "Vincent"]}, "111", "222"
    ]}}
  }
)

ifNull 非空
# 测试数据
db.authors.insertMany([
	{  "title" : "Swift Primer", "like" : 8 }
])

db.authors.aggregate(
  {"$project": {
  "result": {"$ifNull": ["$author", "not exist is null"]}}
  }
)

{ "_id" : ObjectId("63b2b63e653186ee23d724b3"), "result" : "Vincent" }
{ "_id" : ObjectId("63b2b63e653186ee23d724b4"), "result" : "della" }
{ "_id" : ObjectId("63b2b63e653186ee23d724b5"), "result" : "benson" }
{ "_id" : ObjectId("63b2b63e653186ee23d724b6"), "result" : "Vincent" }
{ "_id" : ObjectId("63b2b63e653186ee23d724b7"), "result" : "louise" }
{ "_id" : ObjectId("63b2b63e653186ee23d724b8"), "result" : "yilia" }
{ "_id" : ObjectId("63b2d5a7653186ee23d724b9"), "result" : "Vincent" }
{ "_id" : ObjectId("63b4d7177613bd03eda74636"), "result" : "not exist is null" }


MapReduce

格式说明

MongoDB不允许Aggregation Pipeline的单个聚合操作占用过多的系统内存,如果一个聚合操作消耗20%以上的内存,那么MongoDB直接停止操作,并向客户端输出错误消息。
所以 MapReduce 价值很大。

db.collection.mapReduce(
  function() {emit(key,value);}, //map 函数,遍历collection 中所有的记录,并将 key 与 value 传递给 Reduce
  function(key,values) {return reduceFunction}, //reduce 函数,处理Map传递过来的所有记录
  {
    out: collection,
    query: document,
    sort: document,
    limit: number,
    finalize: <function>,
    verbose: <boolean>
  }
)

  • out :存放统计结果的集合。
  • query :满足条件的文档才调用map函数。
  • sort :一般用于配合limit。优化分组。
  • limit :发往map函数文档数量的上限。
  • finalize :对reduce函数输出结果进行最后的处理。
  • verbose :是否包括结果信息中的时间信息,默认false。
测试数据
db.posts.insert({"post_text": "测试mapreduce。", "user_name": "Vincent",
"status":"active"})
db.posts.insert({"post_text": "适合于大数据量的聚合操作。","user_name": "Vincent",
"status":"active"})
db.posts.insert({"post_text": "this is test。","user_name": "Benson",
"status":"active"})
db.posts.insert({"post_text": "技术文档。", "user_name": "Vincent",
"status":"active"})
db.posts.insert({"post_text": "hello word", "user_name": "Louise",
"status":"no active"})
db.posts.insert({"post_text": "lala", "user_name": "Louise",
"status":"active"})
db.posts.insert({"post_text": "天气预报。", "user_name": "Vincent",
"status":"no active"})
db.posts.insert({"post_text": "微博头条转发。", "user_name": "Benson",
"status":"no active"})

条件过滤、分组、求和
# 结果输出到 post_total 集合
# this代表当前集合
db.posts.mapReduce(
  function() { emit(this.user_name,1); },
  function(key, values) {return Array.sum(values)}, # 求和
  {
    query:{status:"active"}, # 过滤
    out:"post_total" 
  }
)
# 查询结果集合
db.post_total.find()


# 可以换一种写法
var mapFunction1 = function() {
   emit(this.user_name, 1);
};

var reduceFunction1 = function(key, values) {
   return Array.sum(values);
};

db.posts.mapReduce(
   mapFunction1,
   reduceFunction1,
   { out: "post_total2" }
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/355746.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫demo——爬取历史平均房价

简单爬取历史房价 需求 爬取的网站汇聚数据的城市房价 https://fangjia.gotohui.com/ 功能 选择城市 https://fangjia.gotohui.com/fjdata-3 需要爬取年份的数据&#xff0c;等等 https://fangjia.gotohui.com/years/3/2018/ 使用bs4模块 使用bs4模块快速定义需要爬取的…

基于springboot+微信小程序+vue实现的校园二手商城项目源码

介绍 校园二手商城&#xff0c;架构&#xff1a;springboot微信小程序vue 软件架构 软件架构说明 系统截图 技术选型 技术版本说明Spring Boot2.1.6MVC核心框架Spring Security oauth22.1.5认证和授权框架MyBatis3.5.0ORM框架MyBatisPlus3.1.0基于mybatis&#xff0c;使用…

生成对抗网络

目录 1.GAN的网络组成 2.损失函数解释说明 2.1 BCEloss 2.2整体代码 1.GAN的网络组成 2.损失函数解释说明 2.1 BCEloss 损失函数 import torch from torch import autogradinput autograd.Variable(torch.tensor([[1.9072,1.1079,1.4906],[-0.6584,-0.0512,0.7608],[-0.0…

【嵌入式移植】5、U-Boot源码分析2—make nanopi_neo2_defconfig

U-Boot源码分析2—make nanopi_neo2_defconfig 1 概述2 nanopi_neo2_defconfig3 编译过程分析3.1 编译目标3.2 scripts_basic3.2.1 prefix src定义3.2.2 PHONY3.2.3 __build3.2.4 fixdep3.3 objscripts/kconfig 1 概述 上一章中&#xff0c;对Makefile相关源码进行了初步分析&…

Vue-cli脚手架将组件挂载到全局

局部引用组件,直接将组件引入,注册组件即可,这篇文章讲组件挂载到全局的方法! main.js文件 将组件引入main.js文件中,并且注册 使用方法 在需要的地方使用组件即可 BaoGit.Vue代码 <template><div><a href"https://gitee.com/ah-ah-bao"><img …

【机器学习】正则化

正则化是防止模型过拟合的方法&#xff0c;它通过对模型的权重进行约束来控制模型的复杂度。 正则化在损失函数中引入模型复杂度指标&#xff0c;利用给W加权值&#xff0c;弱化了数据的噪声&#xff0c;一般不正则化b。 loss(y^,y)&#xff1a;模型中所有参数的损失函数&…

PID校正

一、Introduction to PID Control PID控制是一种应用非常广泛的控制算法。小到控制一个元件的温度&#xff0c;大到控制无人机的飞行姿态和飞行速度等等&#xff0c;都可以使用PID控制。PID(proportion integration differentiation)其实就是指比例&#xff0c;积分&#xff0…

Python tkinter (10) ——Combobox控件

本文主要是Python tkinter Combobox下拉控件介绍及使用示例。 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinte…

Springboot入门教程详解

Springboot入门教程详解 博客主页&#xff1a;划水的阿瞒的博客主页 欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ 系列专栏&#xff1a;Springboot入门教程详解首发时间&#xff1a;&#x1f39e;2024年1月29日&#x1f3a0; 如果觉得博主的文章还不错的话&#xff0c…

【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数

这段代码功能是根据提供的配置字典&#xff08;d&#xff09;和输入通道列表&#xff08;ch&#xff09;来解析并构建一个YOLOv5模型。函数的核心工作是遍历模型的每一层&#xff0c;并根据配置创建相应的神经网络层。 我们可以在函数中为新增模块配置构造参数设置。 函数中 f…

MyBatis 如何整合 Druid 连接池?

Mybatis 如何整合 Druid 数据连接池呢&#xff1f;首先打开创建的 Maven 工程&#xff0c;找到 pom.xml 文件&#xff0c;添加 Druid 依赖。 <!--druid连接池--> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId&…

MySQL-窗口函数 简单易懂

窗口函数 考查知识点&#xff1a; • 如何用窗口函数解决排名问题、Top N问题、前百分之N问题、累计问题、每组内比较问题、连续问题。 什么是窗口函数 窗口函数也叫作OLAP&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;函数&#xff0c;可…

HCIP复习课(mpls实验)

1、IP配置&#xff1a; R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; R7&#xff1a; R8&#xff1a; 2、rip&#xff0c;ospf配置&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a…

MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推

MySQL知识点总结&#xff08;一&#xff09;——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推 一条SQL的执行过程索引底层数据结构为什么不使用二叉树&#xff1f;为什么不使用红黑树?为什么不使用hash表&#xff1f;为什么不使用…

屏蔽系统热键/关机/注入 Winlogon(中)

1 前言 在新的内容开始前&#xff0c;我想整理一些旧文&#xff0c;这一框题展示了在以前的系统上实现在用户关机/重启/注销时弹出对话框的功能。为什么需要先讲这个部分&#xff1f;因为这一部分需要拦截的函数是截至 Win 8 系统&#xff0c;微软所采用的关机/重启等途径上的…

海外推广是企业必须面临和重视的问

随着中国半导体国际化进程的加快&#xff0c;越来越多的企业开始走向海外市场&#xff0c;对于企业出海来说&#xff0c;想要最大限度的提高曝光度&#xff0c;提升企业核心竞争力&#xff0c;做好海外推广是企业必须面临和重视的问题。萨科微(www.slkoric.com)半导体积极布局海…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(12)

上一篇用MindStudio转换完yolov8的om模型,准备在板卡里进行推理验证了。 我这里用的是我们自己的Tofu5m模块,40mm40mm含外壳尺寸。可以输入网络RTSP视频流直接进行推理。这次用hi3516dv500版本的Tofu5m模块。 SDK里的demo部分是H.264视频输入,为了保持一致来验证,先改成H.…

金融行业现场故障处理实录

KL银行现场服务记录—HA故障 服务时间 2019年9月10日星期二 14&#xff1a;40 到2019年9月11日星期三 0&#xff1a;30 服务内容 排查redhat RHEL 6.4 一个节点cman启动故障。 &#xff08;1&#xff09;、查看系统日志&#xff1b; &#xff08;2&#xff09;、查看ha日志…

工业PoE交换机的应用场景有哪些?

工业PoE&#xff08;Power over Ethernet&#xff09;交换机是一种特殊设计用于工业环境的网络设备&#xff0c;它不仅具备普通交换机的网络连接功能&#xff0c;还能提供电源供给支持PoE设备。以下是工业PoE交换机的一些常见应用场景&#xff1a; 监控系统&#xff1a; 工业…

勒索病毒如何预防?用什么工具

勒索病毒进入服务器加密文件&#xff0c;让文件变得不能访问&#xff0c;我们经常可以见到这样的新闻&#xff0c;被勒索后没什么好的办法&#xff0c;只能交钱。 碰到言而有信的黑客还好。有时候交钱了&#xff0c;坏人也未必给你解密文件。 有什么工具可以预防这样的勒索病…