MongoDB常用操作

news2024/9/27 12:13:45

官网地址:https://www.mongodb.com/docs/manual/reference/method/Date/

  • 实例:系统上运行的进程及节点集,一个实例可以有多个库,默认端口 27017。如果要在一台机器上启动多个实例,需要设置不同端口和不同的dbpath。
  • :多个集合组成数据库,每个数据库都是独立的,有自己的用户、权限信息,独立的存储文件集合。
  • 集合:即是一组文档的集合,集合内的文档结构可以不同,相当于mysql中的表。
  • 文档:mongodb 的最小数据单元,其基本概念为:多个键值对有序组合在一起的数据单元。相当于mysql中的行。

(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<=) 小于等于 - $lte
(!=) 不等于 - $ne

一、操作

【Linux 系统下】

进入MongoDB数据库
mongodbbin 目录 执行 ./mongo
在这里插入图片描述

退出
exit

代码含义
show databases / show dbs显示所有数据库
use 库名使用并切换到指定的数据库
db查看当前使用的数据库
use 不存在的数据库名创建数据库
show tables显示当前数据库下的所有表
db.不存在的表名创建表
==================================
db.dropDatabase()删除当前数据库,默认test,注意要先切换到待删除数据库。

二、新增

1. 创建集合(表)

语法格式:db.createCollection(name, options)
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项

db.createCollection("mycoll", {capped:true, size:100000,max:1000})

options 可以是如下参数:

字段类型描述
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
autoIndexId布尔(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size数值(可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。

2. 插入文档

db.collection.insertOne({**:"**"})   # 将单个文档插入到集合中
db.collection.insertMany({**:"**"}:{**:"**"})  #将多个文件插入集合中
db.collection.insert({**:"**"})       #将单个文档或多个文档插入到集合中

--例子:
db.user.insert({name:"张三",age:23,gender:"男"})

使用 save 方法,如果参数中有id,就更新库中对应ID的值,没有ID就新增一条

db.collection.save()

3. 新增字段

在表 market_entity 中新增字段 adj_close_price , 并且给所有的记录都设置默认值 0.0multitrue 表示全部新增,不写表示默认为 false ,只有第一行新增

db.getCollection('market_entity').update({},{$set:{adj_close_price:'0.0'}},{multi:true})

db.table.update({}, {$set: {"key": "value"}})

三、查看

1. 查看所有文档

db.col.find()

2. 只查看一条文档

只返回符合条件的第一条文档

db.col.findOne();

3. 带条件查找

pretty() 格式化查找结果

db.col.find({"name":"张三"})

//多条件  and 查找
db.col.find({"name":"张三","age":"12"}).pretty()
//or 查找
db.col.find({$or: [{key1: value1}, {key2:value2}]}).pretty()

//查询后只返回第一条,不支持prett()
db.col.findOne();

$lt : 小于
$lte : 小于或等于
$gt : 大于
$gte : 大于或等于
$ne : 不等于

db.students.find({"age":{$lte:27}})

$and 多条件查询

db.collectionName.find({$and:[{query1},{query2}...{queryn}]})

db.students.find({"$and":[{"age":"21"},{"sex":"1"}]})

andor 组合

语法:db.collectionName.find({query1,query2,query3,...,$or:[{query4},{query5},{query6},...]]})

query1-n :都是查询的条件,前面的查询条件和后面的查询条件是or的关系
$or : 前面部分的查询条件是and的关系,后面的是or的关系

db.students.find({age:{$gt:24},sex:0,$or:[{sex:1},{age:27}]})

$in $nin 查询

db.collectionName.find({<key>:{$in:[value1,value2...valuen]}})

db.students.find({"age":{"$in":["21","18"]}})

db.collectionName.find({<key>:{$nin:[value1,value2...valuen]}})

和$in操作符相反,选择不符合条件的所有文档

db.students.find({"age":{"$nin":["21","18"]}})

$not 取反

要和其他操作符配合使用

db.collectionName.find({<key>:{"$not":{"$in":[value1,value2...valuen]}}})

db.students.find({"age":{"$not":{"$in":["21","18"]}}})

ID 作为查询条件

_idObjectId("5ab9de223afa6504457050e2") 是固定写法

db.students.find({_id:ObjectId("5ab9de223afa6504457050e2")})

以特定值开头

db.collectionName.find({<key>:/^value/})

斜杠 /^ 不能省略

db.students.find({name:/^/})

是否包含某个值

db.collectionName.find({<key>:/value/})

前后的两个斜杠 / 不能省略

db.students.find({name:/ng/})

只显示 num

db.collectionName.find({query}).limit(num)

//显示前两条
db.students.find().limit(2)

跳过 num

db.collectionName.find({query}).skip(num)

//跳过2条,从第3条开始显示
db.students.find().skip(2)

分页

db.collectionName.find({query}).skip(pageIndex*pageSize).limit(pageSize)

//跳过10条,从第11条开始显示20条
db.students.find().skip(10).limit(20)

以某个字段的数据类型筛选

db.collectionName.find({<key>:{$type:<value>}})

类型数字备注
Double1
String2
Object3
Array4
Binary data5
Undefined6已废弃。
Object id7
Boolean8
Date9
Null10
Regular Expression11
JavaScript13
Symbol14
JavaScript (with scope)15
32-bit integer16
Timestamp17
64-bit integer18
Min key255Query with -1.
Max key127
//如果想获取 "students" 集合中 name 为 String 的数据,你可以使用以下命令:
db.students.find({"name":{$type:2}})

$slice

$slice 会限制数组元素的个数

$slice:[a,b]
a是正数时,起始位置是a+1,
a是负数时,起始位置a(倒数数组)
b是输出个数

查询输出数组前三个:

db.movies.find({title:"Youth Without Youth"},{languages:{$slice:3}}).pretty();

查询输出数组后两个

db.movies.find({title:"Youth Without Youth"},{languages:{$slice:-2}}).pretty();

查询输出从数组第四个开始,输出前三个

db.movies.find({title:"Youth Without Youth"},{languages:{$slice:[3,3]}}).pretty();

查询输出从数组倒数第五个开始,输出前四个

db.movies.find({title:"Youth Without Youth"},{languages:{$slice:[-5,4]}}).pretty();

$all 和字段值顺序无关的查询

是针对数组字段操作的,可以完成类似模糊查询的效果,并且和字段值的顺序无关。

db.collectionName.find({<key>:{$all:[value1,value2...valuen]}})

 //查询结果  无值
> db.students.find({"frut":["apple","orange"]})

//查询结果  增加了$all操作符的,orange是第三个元素
> db.students.find({"frut":{"$all":["apple","orange"]}})

{ "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple", "banana", "orange" ] }

4. 查询返回结果的数量

db.col.find().count()

5. 返回指定字段

返回的字段中默认带有ID

//没有查询条件,返回 `deviceName` ,结果默认带ID
db.sys_device.find({},{deviceName:1})

//返回 `placeName` 和 `doorName` ,去掉ID
db.sys_device.find({placeName:1,_id:0,doorName:1})

//返回除 `doorName` 以外的所有字段
db.sys_device.find({},{doorName:0})

//除了_id字段,不能在一个projection中联合使用包含和排除语意。如下,会报错
db.sys_device.find({},{doorName:0,placeName:1})

6. 时间范围查询

db.sys_device.find({createTime:{$gte:"2022-12-31"}},{createTime:1})
//表中数据结构 
{ "_id" : ObjectId("63b54955cca77025bbdee70e"), "createTime" : "2023-01-04 17:39:33" }
{ "_id" : ObjectId("63b549cfcca77025bbdee70f"), "createTime" : "2023-01-05 10:53:38" }

7. 排序

1 升序 -1降序

db.collection.find().sort({name:1})

8. $size 根据数组个数查询

db.collectionName.find({<key>:{$size:number}})

 //查询结果,查询只有2个元素的文档
> db.students.find({"frut":{"$size":2}})
{ "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "frut" : [ "apple", "banana" ] }
{ "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "frut" : [ "apple", "banana" ] }

//查询结果,查询只有3个元素的文档
> db.students.find({"frut":{"$size":3}})
{ "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple", "banana", "orange" ] }

9. $elemMatch 根据数组中元素判断

db.collectionName.find({<key>:{$elemMatch:{query}}})

//原始数据
> db.students.find()

            { "_id" : ObjectId("5adb555ca62a80dd1239bb44"), "userName" : "Bob", "values" : [ 1, 2, 3, 4, 5, 6 ] }
            { "_id" : ObjectId("5adb5568a62a80dd1239bb45"), "userName" : "Bob", "values" : 1 }
            { "_id" : ObjectId("5adb556ea62a80dd1239bb46"), "userName" : "Bob", "values" : 2 }
            { "_id" : ObjectId("5adb5571a62a80dd1239bb47"), "userName" : "Bob", "values" : 3 }
            { "_id" : ObjectId("5adb5575a62a80dd1239bb48"), "userName" : "Bob", "values" : 4 }
            { "_id" : ObjectId("5adb5578a62a80dd1239bb49"), "userName" : "Bob", "values" : 5 }
            { "_id" : ObjectId("5adb557ca62a80dd1239bb4a"), "userName" : "Bob", "values" : 6 }


//如果不做限制,数组字段和数字字段都查出来
> db.students.find({"values":{"$gt":1,"$lt":4}})

            { "_id" : ObjectId("5adb555ca62a80dd1239bb44"), "userName" : "Bob", "values" : [ 1, 2, 3, 4, 5, 6 ] }
            { "_id" : ObjectId("5adb556ea62a80dd1239bb46"), "userName" : "Bob", "values" : 2 }
            { "_id" : ObjectId("5adb5571a62a80dd1239bb47"), "userName" : "Bob", "values" : 3 }

//如果我只想针对数组字段操作,可以这样
> db.students.find({"values":{"$elemMatch":{"$gt":1,"$lt":4}}})

            { "_id" : ObjectId("5adb555ca62a80dd1239bb44"), "userName" : "Bob", "values" : [ 1, 2, 3, 4, 5, 6 ] }

10. 内嵌文档查询

语法:<outKey>.<innerKey>
参数说明:
outKey:外部文档(父文档)要操作的字段名称
innerKey:内部文档(子文档)要操作的字段名称

//原始数据
> db.names.find()

            { "_id" : ObjectId("5adb5915a62a80dd1239bb4b"), "name" : { "firstName" : "liu", "lastName" : "lei" } }
            { "_id" : ObjectId("5adb5937a62a80dd1239bb4c"), "name" : { "lastName" : "lei", "firstName" : "liu" } }
            { "_id" : ObjectId("5adb5944a62a80dd1239bb4d"), "name" : { "firstName" : "zhang", "lastName" : "san" } }
            { "_id" : ObjectId("5adb5951a62a80dd1239bb4e"), "name" : { "firstName" : "li", "lastName" : "si" } }
            { "_id" : ObjectId("5adb595ba62a80dd1239bb4f"), "name" : { "firstName" : "wang", "lastName" : "wu" } }



//一般查询:查询结果,大家看好了,其实第一条和第二条两个内容是完全一样的,只是顺序不一样,如果按一般方式查询,只能获取一条记录
> db.names.find({"name":{"firstName":"liu","lastName":"lei"}})

            { "_id" : ObjectId("5adb5915a62a80dd1239bb4b"), "name" : { "firstName" : "liu", "lastName" : "lei" } }


> db.names.find({"name.firstName":"liu","name.lastName":"lei"})

            { "_id" : ObjectId("5adb5915a62a80dd1239bb4b"), "name" : { "firstName" : "liu", "lastName" : "lei" } }
            { "_id" : ObjectId("5adb5937a62a80dd1239bb4c"), "name" : { "lastName" : "lei", "firstName" : "liu" } }

四、修改

1. 集合重命名(表)

db.collection1.renameCollection("collection2")

2. 修改文档

将 name 为张三的文档的年龄改为 25

db.collection.update({name:"张三"},{$set:{age:25}})

save()
如果集合内有ID相同的记录,则替换这条记录。如果集合内没有对应的ID,则新增这条记录

db.collection.save();

$inc 数值字段修改

db.collectionName.update({query},{"$inc":{<key>:number}})

-- 正数加,负数减
db.students.update({"name":"FangShiYu"},{"$inc":{"age":1}})

$push 字段内容修改

针对指定的字段插入文档列表,如果该字段不存在,会建立该字段并插入文档内容,如果存在,就向该字段的列表里追加文档内容。例如:留言板

> documents={document}
> db.collectionName.update({query},{"$push":{<key>:document}})

> query={"name":"tom","say":"i love u!"}
> db.messages.update({"name":"peny"},{"$push":{"comments":query}})

-- 再次追加
> query={"name":"jim","say":"i want to know you!"}
> db.messages.update({"name":"peny"},{"$push":{"comments":query}})

-- 结果
{ 
	"_id" : ObjectId("5abdc29b678c8239350e8a20"), 
	"name" : "peny", 
	"age" : 22, 
	"sex" : 0, 
	"comments" : 
		[
			{ "name" : "tom", "say" : "i love u!" }, 
			{ "name" : "jim", "say" : "i want to know you!" } 
		] 
}

$each 追加多个

$each 必须与 $push 配合使用
追加的时候若集合中没有该字段就新建后追加,若存在就直接追加

> documents=[{document1},{document2},{document3}....{documentn}]
> db.collectionName.update({query},{"$push":{<key>:{"$each":documents}}})

> query=[{"name":"tom","say":"hello!"},{"name":"jackey","say":"i love u!"},{"name":"jerry","say":"i want u"}]
> db.messages.update({"name":"peny"},{"$push":{"comments":{"$each":query}}})

--结果
{ 
	"_id" : ObjectId("5abdc844678c8239350e8a21"), 
	"name" : "peny", 
	"age" : 22, 
	"sex" : 0, 
	"comments" : [ 
		{ "name" : "tom", "say" : "hello!" }, 
		{ "name" : "jackey", "say" : "i love u!" }, 
		{ "name" : "jerry", "say" : "i want u" }] 
}

$slice 控制保存条数

控制记录保存的条数,如果以前有多条会把以前的清空保存条件所规定的记录,如果操作的字段不存在,就会创建该字段

正数保留最早的number条记录,负数保留最新的number条记录

> documents=[{document1},{document2},{document3}....{documentn}]
> db.collectionName.update({query},{$push:{<key>:{$each:documents,$slice:number}}})

//原始记录
{ "_id" : ObjectId("5abdceca678c8239350e8a22"), "name" : "peny", "age" : 18, "sex" : 0 }

------------------------------------------------------------------------------

> var query=[{"name":"lilei","say":"hello"},{"name":"hanmeimei","say":"i miss u"},{"name":"tom","say":"i watch u"},{"name":"ghost","say":"i want u"}];
//因原记录中没有,所以新增
> db.messages.update({},{$push:{"comments":{$each:query,$slice:2}}})

--结果
{"_id":ObjectId("5abdceca678c8239350e8a22"),"name":"peny","age":18,"sex":0,"comments":[{"name":"lilei","say":"hello"},{"name":"hanmeimei","say":"i miss u"}]}

-----------------------------------------------------------------------------------------

--继续操作
> var query=[{"name":"张三","say":"i watch u"},{"name":"李四","say":"i want u"}];
//正数,保留最早的两条记录
> db.messages.update({},{$push:{"comments":{$each:query,$slice:2}}})

--结果
{"_id":ObjectId("5abdceca678c8239350e8a22"),"name":"peny","age":18,"sex":0,"comments":[{"name":"lilei","say":"hello"},{"name":"hanmeimei","say":"i miss u"}]}


-----------------------------------------------------------------------------------------

--继续操作
> var query=[{"name":"张三","say":"i watch u"},{"name":"李四","say":"i want u"}];
//负数,保留最新的两条记录
> db.messages.update({},{$push:{"comments":{$each:query,$slice:-2}}})

--结果
{"_id":ObjectId("5abdceca678c8239350e8a22"),"name":"peny","age":18,"sex":0,"comments":[{"name":"王五","say":"i watch u"},{"monster":"赵六","say":"i want u"}]}

$addToSet 插入数组时过滤重复记录

当插入一个数组时,如果数组中有重复记录,只会直插入一条,不会重复插入,会过滤掉重复的记录

documents=[{document1},{document2},{document3}...{documentn}]
db.collectionName.update({query},{"$addToSet":{<key>:{"$each":documents}}})

//原数据
{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0" }

//定义要插入的文档数组,里面有重复记录,只有最后一个文档不同
> var documents=[{"name":"bob","say":"hi"},{"name":"bob","say":"hi"},{"name":"bob","say":"hi"},{"name":"bob","say":"hello"}];
> db.messages.update({"name":"peny"},{"$addToSet":{"comments":{"$each":documents}}});

//结果
{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hi" }, { "name" : "bob", "say" : "hello" } ] }

$pop 在数组中进行删除

从数组中进行向前删除或者向后删除,+1正数表示从尾部开始删除,-1负数表示从头开始删除。

db.collectionName.update({query},{"$pop":{<key>:1(从后开始删除)/-1(从头开始删除)}})

//原始数据
{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hi" }, { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" } ] }

//执行删除操作,并且执行成功
> db.messages.update({"name":"peny"},{"$pop":{"comments":-1}})


//执行结果,把comments数组的第一个元素删除了
{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" } } ] }

$pull 根据数组字段删除

根据指定条件删除数组字段里面的指定文档数据,pop只能删除头部或者尾部的数据

db.collectionName.update({query},{"$pull":{<key>:{query2}}})

//原始数据
{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi2" }, { "name" : "bob", "say" : "hi3" }] }

//执行删除操作,并且执行成功
> db.messages.update({"name":"peny"},{"$pull":{"comments":{"say":"hi2"}}})


//结果数据,已经删除了说话内容是“hi2”的文档
{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi3" } ] }

index 数组下标操作

db.collectionName.update({query},{"$set":{<key>.index.<key2>:<vlaue>}})

{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi3" }] }


//需要修改【comments】字段里面下标为【2】的【say】字段的值
> db.messages.update({"name":"peny"},{"$set":{"comments.2.say":"i am modifing!"}})


//修改结果
{ "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "i am modifing!" }] }

$ 修改数组中所有符合条件的数据

db.collectionName.update({query},{"$set":{<key>.$.<key2>:<vlaue>}})

//原始数据
{ "_id" : ObjectId("5ac70d2f7a05450cf60c6887"), "name" : "peny", "age" : 18, "sex" : 0, "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "i'm changing" }, { "name" : "tom", "say" : "i love y" } ] }


//修改名称【name】是【bob】的文档,把【say】字段的内容修改为【I'm a robbot】
> db.students.update({"comments.name":"bob"},{"$set":{"comments.$.say":"I'm robbot"}})


//修改结果
{ "_id" : ObjectId("5ac70d2f7a05450cf60c6887"), "name" : "peny", "age" : 18, "sex" : 0, "comments" : [ { "name" : "bob", "say" : "I'm robbot" }, { "name" : "bob", "say" : "i'm changing" }, { "name" : "tom", "say" : "i love y" } ] }

$min $max 数值比较

如果给定值(value1)小于字段的当前值,则更新字段值为给定值。$min运算符可以比较不同类型的数字。

{ $min: { <field1>: <value1>, ... } }

--数据
	{ "_id" : 1, "highScore" : 90, "lowScore" : 50 }

db.score.update({_id:1}, {$min : {lowScore : 10}})

--结果
	{ "_id" : 1, "highScore" : 90, "lowScore" : 10 }

3. 修改字段

update 方法

db.表名.update({},{$rename:{"原字段":"新字段"}},false,true)

  1. 第一个false:可选,如果根据过滤条件找不到记录时,true为插入新的记录,默认是false,不插入。
  2. 第二个true表示:可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
db.students.update({},{$rename:{"name":"studentName"}},false,true);

db.getCollection("表名").update({},{$rename:{"原字段":"新字段"}},{multi:true})

db.getCollection("students").update({},{$rename:{"name":"studentName"}},{multi:true});

【修改多个】

db.表名.update({},{$rename:{"原字段1":"新字段1","原字段2":"新字段2"}},false,true)

db.students.update({},{$rename:{"name":"studentName", "age":"studentAge"}},false,true);

【内嵌字段】

db.表名.update({},{$rename:{"外部字段.原字段":"外部字段.新字段"}},false,true)

{
  "_id": 1,
  "alias": [ "LiMing", "Ming" ],
  "contact": { "qq" : "123456", "mobile" : "123-567-8899" }
}


db.students.update({}, {$rename:{"contact.mobile": "contact.phone" }},false,true)

-- 或者
db.getCollection("students").update({},{$rename:{"name":"studentName"}},{multi:true});

updateMany 方法

db.表名.updateMany({},{$rename:{"原字段":"新字段"}})

db.students.updateMany({},{$rename:{"name":"studentName"}});

【修改多个】
db.表名.updateMany({},{$rename:{"原字段1":"新字段1","原字段2":"新字段2"}})

db.students.updateMany({},{$rename:{"name":"studentName", "age":"studentAge"}});

五、删除

1. 集合删除

删除集合:同样需要先切换到该集合

db.collection.drop()

2. 删除文档

删除后不能撤销

//按条件删除
db.sys_device.remove({"name":"张三"})
//没有条件删除全部
db.sys_device.remove({})
//删除符合条件的第一条数据
db.students.remove({sex:1},{justOne:true})

3. 删除字段

-- 删除整个文档的   false:当记录不存在的时候是否增加记录    true:是否需要修改多条记录
db.table.update({},{$unset:{content:""}},false, true)

参考:https://www.cnblogs.com/PatrickLiu/p/8669020.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四章web服务器之httpd

文章目录第四章 web服务器1.1 www简介1.1.1 网址及HTTP简介1.1.2 HTTP协议请求的工作流程1.2 www服务器的类型1.2.1 仅提供用户浏览的单向静态网页1.2.2 提供用户互动接口的动态网站1.3 www服务器的基本配置1.4 实验1.4.1 搭建静态网站——基于http协议的静态网站1.4.2 搭建静态…

Acwing---1211.蚂蚁感冒

蚂蚁感冒1.题目2.基本思想3.代码实现1.题目 长 100 厘米的细长直杆子上有 nnn 只蚂蚁。 它们的头有的朝左&#xff0c;有的朝右。 每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是 1 厘米/秒。 当两只蚂蚁碰面时&#xff0c;它们会同时掉头往相反的方向爬行。 这些蚂蚁中…

C语言基本数据类型(一)

文章目录 前言 一、int类型 二、八进制和十六进制 三、其他整数类型 四、char 类型 五、_Bool 类型 六、 可移植类型&#xff1a;stdint.h和unttypes.h 前言 C语言基本数据类型包括声明变量、如何表示字面值常量&#xff0c;以及经典的用法。 一、int类型 C语言中包括许…

【openGauss】在openEuler(ARM架构)上安装openGauss(一主一备)

一、系统版本介绍 当前案例中的openGauss安装&#xff0c;底层操作系统为openEuler-20.03-LTS版本&#xff0c;当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本&#xff0c;该实验使用的openEuler版本自带Python 3.7.4&#xff0c;不需要再自行安装 二…

零基础如何入门网络安全?2023年最新,建议收藏!

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

前端必会手写面试题合集

实现Event(event bus) event bus既是node中各个模块的基石&#xff0c;又是前端组件通信的依赖手段之一&#xff0c;同时涉及了订阅-发布设计模式&#xff0c;是非常重要的基础。 简单版&#xff1a; class EventEmeitter {constructor() {this._events this._events || ne…

电力系统IEEE33节点Simulink仿真研究(Matlab实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

arduino基本知识认识和学习资源

个人对ardunio的感觉 **像是一个模块化功能的单片机&#xff0c;编程时在单片机中就像python在计算机语言的感觉。**硬件方面的功能比较单一依赖于传感器和硬件电路&#xff1b;编程比较简单&#xff0c;所有执行的函数都已经被封装&#xff0c;所以想要成为第一个用这个库吃瓜…

【C语言刷题】猜名次、猜凶手、杨辉三角、杨氏矩阵、字符串左旋、判断是否为左旋子串

目录 一、猜名次 二、猜凶手 三、杨辉三角 解法一&#xff1a; 解法二 四、杨氏矩阵 解法一 解法二 五、字符串左旋 解法一 解法二 六、判断是否为字符串左旋字串 解法一 解法二 总结 一、猜名次 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果…

基于轻量级CNN开发构建学生课堂行为识别系统

其实早在之前&#xff0c;我的一些文章里面就有做过关于学生课堂行为检测识别的项目&#xff0c;感兴趣的话可以自行移步阅读&#xff1a;《yolov4-tiny目标检测模型实战——学生姿势行为检测》《基于yolov5轻量级的学生上课姿势检测识别分析系统》这些主要是偏目标检测类的项目…

Raft论文阅读

Raft 论文阅读 参考&#xff1a; Raft Paper 一文搞懂Raft算法 - xybaby Raft Demo Raft 实现汇总 Raft 为什么是更易理解的分布式一致性算法 空挡) Raft协议实现之etcd(一)&#xff1a;基本架构 Raft 协议 - buttercup 【raft】学习二&#xff1a;etcd/raft raft数据结构学…

第四十八讲:神州路由器IPv6静态路由配置

实验拓扑图如下所示 配置步骤&#xff1a; 步骤1&#xff1a;配置R1接口 R1_config#ipv6 unicast-routing //启用IPv6路由 R1_config#in g0/4 R1_config-_g0/4#ipv6 address 2001:10::1/64 //手工配置IPv6地址 R1_config-…

LInux背景【Linux】

一、技术推动社会发展的基本动力作为万物之长的人类&#xff0c;我们相较于其他的生物哪里是特殊的&#xff1f;举一个例子&#xff1a;老虎需要几千上万年进化来的爪子&#xff0c;人类可以在更短的时间内通过制造石矛石斧这类工具变可以模拟。通过这一个例子我们得出——人的…

python自学之《21天学通Python》(7)

第10章 Python进阶话题 10.1 函数与命名空间 Python中可以通过模块来管理复杂的程序&#xff0c;而将不同功能的函数分布在不同的模块中&#xff0c;那么函数及其全局命名空间决定了函数中引用全局变量的值。函数的全局命名空间始终是定义该函数的模块&#xff0c;而不是调用该…

java面试之Spring篇

一、Spring概述 1. Spring由哪些模块组成 spring core&#xff1a;提供了框架的基本组成部分&#xff0c;包括控制反转&#xff08;Inversion of Control&#xff0c;IOC&#xff09;和依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;功能。spring beans…

windows无线连接Linux服务器,实现终端操作与文件传输

0、建议安装完Ubuntu后按照百问网的设置安装必要的linux软件 执行&#xff1a; git clone https://e.coding.net/weidongshan/DevelopmentEnvConf.git cd DevelopmentEnvConf sudo ./Configuring_ubuntu.sh 等待安装完成&#xff0c;大约半个小时事件。 我搭建的环境 家…

git的使用

一、创建仓库 gitee官网创建好用户之后&#xff0c;我们点创建仓库。 选择好语言&#xff0c;开源许可证随便选一个即可&#xff0c;模板我们最好设置一个Readme文件&#xff0c;方便后面写明仓库的介绍。 分支模型我们新手选一个单分支模型就可以了。 因为仓库创建的时候只能…

Windows下Canal.admin-1.1.6安装部署

一、下载解压 1 下载 进入页面&#xff1a;Release v1.1.6 alibaba/canal GitHub 下载 canal.admin-1.1.6.tar.gz 2 解压 解压至目录&#xff1a;D:\Tools\canal.admin-1.1.6 二、创建数据库 canal_manager 1 创建时间数据库&#xff1a;canal_manager 2 初始化元数据…

并发编程学习案例-模拟抢红包

一、前言 再来系统动手学习一下Java并发编程。 知识点&#xff1a;CountDownLatch 的发令枪使用模式&#xff1b;红包均分&#xff0c;最后一个分不完的解决方法 抢红包的需求,每个红包均分&#xff0c;最后一个除外 1. 设置红包总额 2. 设置红包的个数 3. 模拟抢红包的人数 &a…

图文结合带你搞懂MySQL日志之relay log(中继日志)

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; KAiTO文章来源&#xff1a;GreatSQL社区原创 什么是中继日志&#xff08;relay log&#xff09; 中继日志&a…