MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作(结构清晰万字长文)
文章目录
- 1. 容器与应用之间的关系介绍
- 2. 使用 Docker 容器安装 MongoDB
- 3. Mongosh 操作
- 3.1 Mongosh 连接到 MongoDB
- 3.2 基础操作与 CRUD
- 4. Python 操作 MongoDB
- 5. Nodejs 操作 MongoDB
- 5.1 Mongodb 和 Mongoose
- 5.2 推荐在项目中使用 Mongoose
- 参考文献
1. 容器与应用之间的关系介绍
MongoDB 的安装有时候并不是那么容易的,为了简化这个步骤,比较舒适好用的方法是使用容器(Container)安装。
在讲容器之前先说一下容器的镜像(Image),镜像是容器的前置基础,是一个关于某些应用的软件包。在镜像里规定了要运行这个应用需要准备的所有内容,包括代码、运行时、库、环境变量和配置文件等。通过一个镜像可以创建和运行容器实例。(镜像如下图1)

容器是一套完整的应用程序环境,包括应用程序本身及其所有依赖项,如库、运行时、系统工具和设置等。通过使用容器启动应用程序,用户无需手动解决各种依赖和系统环境问题,即可实现快速启动。以 MongoDB 为例,启动该数据库只需下载相应的 MongoDB 镜像,然后使用该镜像创建容器,即可立即启动 MongoDB 服务如下图 2 所示。

需要注意的是,尽管 MongoDB 运行在容器中,但实际上并非完全在本地执行。以在 Linux 主机内安装 MongoDB 为例:在 Linux 环境下进行安装需要一个操作系统,因此在容器中,除了 MongoDB,还需要集成一个完整的操作系统。
整理说明即在我们的 Linux 主机(最先希望安装数据库的机器)中,有一个容器,在这个容器内有一个 Linux 的系统,在这个系统中,安装了一个 MongoDB 的服务,所谓的使用容器运行 MongoDB 就是指使用了这样一个服务。
到这里是否有个疑问——这应该算是在当前主机访问另一个主机了,那么我们要怎么访问这个 MongoDB 呢?是否应该进入到这个系统中,然后像使用别的数据库那样,打开一个 CLI 客户端,输入指令进行增删改查呢?
当然,这确实是一种访问方式。实际上我们知道就算是安装在本地的数据库,也会选择工作在一个端口中。譬如 MySQL 的 3306,Redis 的 6379,MongoDB 的是 27017。所以容器就将系统内端口与主机的端口建立了相互的映射,将容器内的一个端口映射成主机的端口,就像是上面图 2 的 PORTS 所示,此时容器的 27017 端口就是主机的 27017 端口,访问主机的 27017 端口即是访问容器的 27017 端口。
2. 使用 Docker 容器安装 MongoDB
-
使用以下命令安装一个 Docker,如果你还没有的话
apt install docker.io安装完毕后可以使用以下命令验证,如正确安装会显示一个版本号
docker --version -
使用以下命令下载 MongoDB 镜像
docker pull mongo下载完成后可以使用以下命令查看镜像列表
docker images -
使用下载好的镜像启动 MongoDB 容器
docker run -d -p 27017:27017 --name my-mongodb mongo在上述命令中,run 是启动一个容器,
-d是指定在后台运行;-p是在主机和容器之间创建端口映射,冒号左侧是主机端口,右侧是容器端口;--name是为当前容器命名,mongo是镜像名,如果有版本需求,还可以加上版本标签,如mongo:latest,具体的镜像名称和版本号可以通过镜像列表查看。容器启动后的情况使用
docker ps命令查看如下图划线部分所示:
-
使用下面的命令在进入到容器内
docker exec -it 8424792f4ec4 /bin/bash其中
exec是指在容器内执行命令,-i是使标准输入保持打开,-t是分配一个伪终端,同时使用可以理解为交互式执行命令,并分配一个伪终端,8424792f4ec4是容器的 ID,保证唯一的情况下可以简略输入。/bin/bash是实际使用的 Shell(Shell 可以理解为一种命令行界面),当然你也可以只输入bash,这是一样的效果。由此可以持续性地操作容器。情况大概如下图所示,与操作 Linux 没什么不同,顺便一提得是,从 MongoDB 的 Dockerfile 中可以看到大致的安装过程。
-
在容器内使用如下命令,进入到 MongoDB 的 Shell 中。
mongosh当出现下面的状态时就代表了成功进入,那之后的操作将会在下文中详细说明。

-
如需了解更多的 Docker 命令,可以查阅此文档 https://dockerdocs.cn/reference/index.html
3. Mongosh 操作
3.1 Mongosh 连接到 MongoDB
在 2.5 中使用 mongosh 命令连接到 MongoDB 仅为使用默认参数,该命令加上一些可能使用到的参数后类似于下面这个命令:
mongosh --host localhost --port 27017
或者类似于下面这一行:
mongosh "mongodb://localhost:27017"
这在 MongoDB 中被称为连接串(Connection String),即使用一个字符串来代表所有的参数。连接串的使用常见于使用代码连接 MongoDB 的场景。
为了安全性,一般需要启用密码来登录 MongoDB。在容器中要通过 conf 来使用密码比较困难,推荐的做法是在容器启动的时候设置一些环境变量来启用密码,如下:
docker run -d -p 27017:27017 --name my-mongodb2 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=admin123 \
-e MONGO_INITDB_DATABASE=admin \
mongo
这个命令在启动容器的时候为 Mongodb 设置了一个 ROOT 用户 admin,密码是 admin123,在指定的数据库 admin 中进行身份验证。(注意事项:在设置密码或者账号时候,尽量避免使用 “:”、“@” 等符号,以保证密码字符串会被数据库引擎正确解析。)
这个时候如果只像上文一样,Mongosh 只设置了端口号和主机名的话,是没有权限操作的,得到的结果就像下面一样:
test> show databases
MongoServerError: Command listDatabases requires authentication
使用以下的方法选择一个进行身份验证:
1. mongosh --username admin --password admin123
2. mongosh "mongodb://admin:admin123@localhost:27017"
3. mongosh --username admin --password admin123 --authenticationDatabase admin
4. mongosh "mongodb://admin:yejue123@localhost:27017/database?authSource=admin"
如果你的用户是创建在 admin 数据库以外的,需要指定在哪个数据库进行验证,并且登录后也只能看到那一个数据库。
另外,可以依次执行下列命令看到容器在启动时设置的用户:
use admin
show collections
db.system.users.find()

3.2 基础操作与 CRUD
以下列出一些简单的操作:
# 显示数据库
show databases# 创建数据库/切换数据库
use databasename# 查看内置的 role
show roles# 在当前数据库创建一个用户
db.createUser({user: username, pwd: password, roles: [{role: "readWrite", db: dbtabases name}]}
)# 查看当前数据库的所有用户
db.getUsers()# 查看所有的集合
show collections
Mongodb 是面向文档的 NoSQL 的数据库,数据通常以 BSON 格式存储,而在 Mongosh 中看到的则是以 JSON 格式显示的。MongoDB 有三种组织数据的层级:数据库、集合(Collection)、文档(Document)。他们之间的关系用一句话概括即 “在一个数据库中有若干个集合,集合内通常存放着有相似内容的文档”。如果以关系型数据库来类比,则集合相当于一个表,一个文档相当于一行记录。这个文档并非常见的“文件文档”,而是一个键值对形式的 JSON/BSON 对象。下面我们将以一些例子来引入完整的 CRUD,请读者在其中体会集合与文档的含义。
例1:假设有一个图书管理系统的数据库,里面有各种各样的图书。
-
创建一个数据库 “BookManagement”。
use BookManagement -
使用
db.createCollection()函数来创建名为books的集合,执行以下命令:db.createCollection("books")以默认参数创建的集合没有大小限制,存储空间会自动增长。可以通过指定一些参数来限制集合大小是否自动增长,如下则设置了一个最大存储空间
100 MB、最大文档数量为1000的集合:db.createCollection("books", { capped: true, size: 100 * 1024*1024, max: 1000})可以通过
db.collection.stats()函数看到集合的设置:db.books.stats() -
Insert
向集合内插入文档(数据)的方式有两种,下面我们分别以单条插入和多条插入的方法,向resources插入几个文档。单个插入
db.collection.insertOne():db.books.insertOne({title: "围城",authors: ["钱钟书"],publication_year: 1947,publisher: "上海文艺出版社",tags: ["小说", "讽刺文学"],remainings: 10 })批量插入
db.collection.insertMany():db.books.insertMany([{title: "活着",authors: ["余华"],publication_year: 1993,publisher: "作家出版社",tags: ["小说", "现实主义"],remainings: 5},{title: "红楼梦",authors: ["曹雪芹"],publication_year: 1791,publisher: "人民文学出版社",tags: ["古典小说", "传统文学"],remainings: 8}, ])现在可以通过以下函数来查询集合中所有的文档:
db.books.find() -
Query
接下来将演示三种常见的查找:“=”、“in”、“AND / OR”。
第一种,指定相等条件:查找书名为“活着”的书BookManagement> db.books.find({title: "活着"}) [{_id: ObjectId('65b49ed320bf3de68d11029c'),title: '活着',...} ]第二种,使用查询运算符
$in:查找书名在下列所给出的列表中的书籍BookManagement> db.books.find({title: {$in: ["活着","围城"]}}) [{_id: ObjectId('65b49da320bf3de68d11029b'),title: '围城',...},{_id: ObjectId('65b49ed320bf3de68d11029c'),title: '活着',...} ]第二种,使用查询运算符
gte:查询剩余数量大于等于 10 的BookManagement> db.books.find({remainings: {$gte: 10}}) [{_id: ObjectId('65b49da320bf3de68d11029b'),title: '围城',remainings: 10...} ]更多的查询运算符请查阅此文档:https://www.mongodb.com/docs/manual/reference/operator/query/#query-selectors
第三种,逻辑运算符
AND:查找出版年份大于 1700 年并且是小说类型的BookManagement> db.books.find({publication_year: {$gt: 1700}, tags: {$in: ["小说"]}}) [{title: '围城',publication_year: 1947,tags: [ '小说', '讽刺文学' ],...},{title: '活着',publication_year: 1993,tags: [ '小说', '现实主义' ],...} ]从结果中可以看到《红楼梦》并没有被匹配到,因为红楼梦的标签里是“古典小说”,如果我们希望凡是含有“小说”的都看做是小说,加上我们的
tags是一个列表,那么查询条件就成了这样:查找年份大于 1700 的,内部任一标签中含有“小说”字样的书。这个查询可以使用元素匹配运算符$elemMatch和正则运算符$regex,对tags中每一个标签进行匹配查询。BookManagement> db.books.find({publication_year: {$gt: 1400}, tags: {$elemMatch: {$regex: "小说"}}}) [{title: '围城',publication_year: 1947,tags: [ '小说', '讽刺文学' ],...},{title: '活着',publication_year: 1993,tags: [ '小说', '现实主义' ],...},{title: '红楼梦',publication_year: 1791,tags: [ '古典小说', '传统文学' ],...} ]第三种,逻辑运算符
OR:查找出版年份大于 1990 或者剩余数量大于等于 10 的BookManagement> db.books.find({$or: [{publication_year: {$gt: 1990}}, {remainings: {$gte: 10}}]}) -
Update
MongoDB 的更新操作可以使用updateOne、updateMany方法。这两个方法的参数第一个是过滤器,第二个是更新操作,以及一些参数。db.collection.updateOne(<filter>, <update>, options) db.collection.updateMany(<filter>, <update>, options)其中 filter 即指定过滤(匹配)条件,与上文中的查询一致,当查询到若干条或单条数据后,对这些数据进行更新操作。如果是
updateOne则对匹配到的第一条进行更新,如果是updateMany则对匹配到的所有条目进行更新。以下是一些基础示例:【例1】假设要将《活着》的书库存设置为 20:
BookManagement> db.books.updateOne({title: "活着"}, {$set: {remainings: 20}}) {acknowledged: true,insertedId: null,matchedCount: 1,modifiedCount: 1,upsertedCount: 0 }在这个示例中,使用了
$set操作符将剩余数量直接改成了 20,返回的结果中,“matchedCount” 是匹配到的数量,“modifiedCount ” 是修改的文档数量,其中 “upsertedCount” 是更新插入的数量,如果在 options 中使用{upsert: true},那么当 filter 匹配不到文档的时候,将会新建一个文档。【例2】假设要将所有的书库存设置为 0:
BookManagement> db.books.updateMany({}, {$set: {remainings: 0}}) {acknowledged: true,insertedId: null,matchedCount: 3,modifiedCount: 3,upsertedCount: 0 }有些时候我们只希望在原有的基础上增加,而不是完全覆盖式更新。下面给出一些例子:
【例3】将 2000 年前的书增加一个标签 “2000年前的书”:
db.books.updateMany( {"publication_year": { $lt: 2000 }},{$addToSet: { "tags": "2000年前的书" }} )上述操作使用了
$lt(小于)操作符,找到所有出版年份早于 2000 年的书籍。然后,使用$addToSet操作符将新标签添加到每个匹配文档的 “tags” 数组中。如果标签已经存在于某本书的 “tags” 数组中,$addToSet会确保不重复添加相同的标签。如果不需要查重,可以使用$push操作符,这样无论标签是否已存在,都会被添加到 “tags” 数组中。 -
Delete
想要删除特定条件下的文档,可以使用deleteOne或deleteMany操作。以下是一些示例:
【例4】删除出版年份早于 1800 年的书:BookManagement> db.books.deleteMany({publication_year: {$lt: 1800}}) { acknowledged: true, deletedCount: 1 }【例5】删除 “tags” 中含有“小说”字样的书,但只删除默认排序的第一本:
BookManagement> db.books.deleteOne({tags: "小说"}) { acknowledged: true, deletedCount: 1 }此时查看 Collection 里的结果,是《围城》被删掉了,剩下一本书《活着》。MongoDB 的默认排序是按照 “_id” 升序排序。《围城》在本例中是第一个被插入到 Collection 中的,所以优先被匹配删除。
自此 CRUD 告一段落,对于CRUD 更多的细节,可以参照 MongoDB 的官方文档,已在本文末尾列出。
4. Python 操作 MongoDB
当使用 Python 连接 MongoDB 并执行 CRUD 操作时,可以使用 pymongo 库。本节将会使用一些简单示例,演示如何连接到 MongoDB 并执行基本的 CRUD 操作。首先,确保你已经安装了 pymongo 库:
pip install pymongo
接下来,你可以使用以下示例代码连接到数据库:
import pymongo# MongoDB 连接字符串,格式为:mongodb://<username>:<password>@<host>:<port>/<database>
# 如果不需要认证,可以省略 <username>:<password>@ 部分
connection_string = "mongodb://username:password@localhost:27017/mydatabase"# 创建 MongoDB 客户端
client = pymongo.MongoClient(connection_string)
连接串已经在上文 3.1 中做了详细介绍,在此不做过多介绍。
通常创建完成客户端后并不一定就成功连接了,运行下面的代码进行检查,如果成功连接可以看到输出的数据库名字。
print(client.list_database_names())
接下来创建一个数据库和集合:
# 创建或选择数据库
db = client.BookManagement
print(db)
# 创建或选择集合
collection = db.books
print(collection)
在代码中创建数据库和集合与 Mongosh 中的逻辑相近,均为不存在则创建,如果存在则选择。
现在我们已经连接到 MongoDB 并选择了数据库和集合,我们可以开始执行 CRUD 操作。以下是一些基本的示例:
Insert
# 插入文档
document_to_insert = {"name": "John Doe", "age": 30, "city": "New York"}
result = collection.insert_one(document_to_insert)
print("成功插入文档,文档ID:%s" % result.inserted_id)
Query
# 查询文档
query_to_find = {"city": "New York"}
documents = collection.find(query_to_find)
print(list(documents))
Update
query_to_update = {"name": "John Doe"}
update_data = {"$set": {"age": 31}}
result = collection.update_one(query_to_update, update_data)
print("成功更新文档,匹配:%d,修改:%d" % (result.matched_count, result.modified_count))
所有的过滤器书写规则与 Mongosh 一致,在 Python 中需要注意的是 Python 字典并不能直接写诸如 “$set” 等的操作符,应遵循 Python 的规则,使用字符串的方式来写入操作符。如需查看详情请参照上文 3.2 部分。
Delete
# 删除文档
result = collection.delete_one(query_to_update)
print("成功删除文档,删除:%d" % result.deleted_count)
Disconnect
# 断开与 MongoDB 的连接
client.close()
5. Nodejs 操作 MongoDB
5.1 Mongodb 和 Mongoose
在 Node.js 中,有几种库可以用来操作 MongoDB。其中两个主要的是 MongoDB 官方的驱动程序(mongodb)和 Mongoose(推荐项目中使用 Mongoose)。以下是它们的简要介绍:
- MongoDB 官方驱动程序(mongodb):
- 安装:
npm install mongodb - 特点:
- 提供了 MongoDB 的原生驱动程序,允许直接与 MongoDB 数据库进行低级别的交互。
- 支持各种 MongoDB 特性和操作。
- 对于直接操作 MongoDB,执行原生的查询和操作,是一个轻量级的选择。
- 使用示例
const { MongoClient } = require('mongodb');// 连接到数据库 const client = new MongoClient('mongodb://localhost:27017', { useNewUrlParser: true, useUnifiedTopology: true }); client.connect().then(async () => {// 在这里执行 MongoDB 操作const database = client.db('mydatabase');const collection = database.collection('mycollection');// 插入文档const documentToInsert = { name: 'John Doe', age: 30, city: 'New York' };await collection.insertOne(documentToInsert);// 查询文档const queryToFind = { city: 'New York' };const result = await collection.find(queryToFind).toArray();console.log(result);// 更新文档const queryToUpdate = { name: 'John Doe' };const updateData = { $set: { age: 31 } };await collection.updateOne(queryToUpdate, updateData);// 查询更新后的文档const documentsAfterUpdate = await collection.find(queryToUpdate).toArray();console.log(documentsAfterUpdate);// 删除文档await collection.deleteOne(queryToUpdate);// 关闭连接client.close(); });
- 安装:
- Mongoose
- 安装:
npm install mongoose - 特点:
- 提供了对象模型工具,允许在应用中定义模型和模式,更易于维护和扩展。
- 封装了 MongoDB 的原生驱动,提供了更高级别的抽象和功能,例如中间件、查询构建、数据验证等。
- 适用于构建复杂的数据模型和应用。
- 使用示例(此处仅为格式对称用代码,可以直接看 5.2)
const mongoose = require('mongoose');// 连接到数据库 mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });const db = mongoose.connection;db.once('connected', async () => {// 在这里执行 Mongoose 操作const MyModel = mongoose.model('MyModel', new mongoose.Schema({name: String,age: Number,city: String}));// 插入文档const documentToInsert = new MyModel({ name: 'John Doe', age: 30, city: 'New York' });await documentToInsert.save();// 查询文档const documents = await MyModel.find({ city: 'New York' });console.log(documents);// 更新文档await MyModel.updateOne({ name: 'John Doe' }, { $set: { age: 31 } });// 查询更新后的文档const documentsAfterUpdate = await MyModel.find({ name: 'John Doe' });console.log(documentsAfterUpdate);// 删除文档await MyModel.deleteOne({ name: 'John Doe' });// 关闭连接mongoose.connection.close(); });
- 安装:
5.2 推荐在项目中使用 Mongoose
推荐 Mongoose 的最大原因就是 Mongoose 允许你使用模式(Schema)来定义 MongoDB 文档的结构和规则。这使得数据模型的定义更加清晰,模式还支持数据验证,确保数据符合预期的格式和规则。下面是一个模型示例:
const mongoose = require('mongoose');// 模式定义
const bookManagementSchema = new mongoose.Schema({title: {type: String,required: true},author: String,publishedDate: Date,genre: String
}, { collection: 'book_management' });// 模型创建
const BookManagementModel = mongoose.model('BookManagement', bookManagementSchema);
在这个模型中,我们使用 Schema 预定义了一个 book_management 的集合,可以清楚地看到其中的参数及其参数类型。
在执行完模型创建的代码后,数据库中创建了一个空的 Collection,以下是一些基本的 CRUD 示例:
async function main() {// 创建文档并保存 (Create)const newBook = new BookManagementModel({title: 'The Great Gatsby',author: 'F. Scott Fitzgerald',publishedDate: new Date('1925-04-10'),genre: 'Fiction'});const savedBook = await newBook.save();console.log('保存文档成功:', savedBook);// 查询文档 (Read)const query = { title: 'The Great Gatsby' };const foundBooks = await BookManagementModel.find(query);console.log('查询到的文档:', foundBooks);// 更新文档 (Update)const updateQuery = { title: 'The Great Gatsby' };const updateData = { $set: { genre: 'Classic' } };const updateResult = await BookManagementModel.updateOne(updateQuery, updateData);console.log('更新文档成功:', updateResult);// 查询更新后的文档const updatedBooks = await BookManagementModel.find(updateQuery);console.log('更新后的文档:', updatedBooks);// 删除文档 (Delete)const deleteQuery = { title: 'The Great Gatsby' };const deleteResult = await BookManagementModel.deleteOne(deleteQuery);console.log('删除文档成功:', deleteResult);// 关闭连接mongoose.connection.close();
}
参考文献
MongoDB 官方详细文档:https://www.mongodb.com/docs/manual/
MongoDB CRUD 速览:https://www.mongodb.com/docs/mongodb-shell/crud/
Mongoose 官方文档 Model 部分:https://mongoosejs.com/docs/models.html
相关文章:
MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作(结构清晰万字长文)
文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB5.1 Mongodb 和 Mongoose5.2 推荐在项目中使用 Mongoose 参考文献 1. 容器与应用之间的关系…...
超越传统—Clean架构打造现代Android架构指南
超越传统—Clean架构打造现代Android架构指南 1. 引言 在过去几年里,Android应用开发经历了巨大的变革和发展。随着移动设备的普及和用户对应用的期望不断提高,开发人员面临着更多的挑战和需求。传统的Android架构在应对这些挑战和需求时显得有些力不从…...
WebGL开发项目的类型
WebGL(Web Graphics Library)是一种用于在Web浏览器中渲染交互式3D和2D图形的JavaScript API。使用WebGL,可以开发各种类型的项目,包括但不限于以下几种,希望对大家有所帮助。北京木奇移动技术有限公司,专业…...
CUDA编程- - GPU线程的理解 thread,block,grid - 学习记录
GPU线程的理解 thread,block,grid 一、从 cpu 多线程角度理解 gpu 多线程1、cpu 多线程并行加速2、gpu多线程并行加速2.1、cpu 线程与 gpu 线程的理解(核函数)2.1.1 、第一步:编写核函数2.1.2、第二步:调用核函数(使用…...
yum 报错 ZLIB_1.2.3.3 not defined in file libz.so.1
这篇记录工作中发现的,库文件被修改导致 yum 无法正常使用的问题排查过程 问题描述 1)执行yum 报错说python2.7.5 结构异常,发现/usr/bin/yum 的解释器被修改过,恢复成/usr/bin/python即可 2)恢复后,发现…...
数字孪生智慧能源电力Web3D可视化云平台合集
前言 能源电力的经济发展是中国式现代化的强大动力,是经济社会发展的必要生产要素,电力成本变化直接关系到工业生产、交通运输、农业生产、居民生活等各个方面,合理、经济的能源成本能够促进社会用能服务水平提升、支撑区域产业发展…...
DataTable.Load(reader)注意事项
对于在C#中操作数据库查询,这样的代码很常见: using var cmd ExecuteCommand(sql); using var reader cmd.ExecuteReader(); DataTable dt new DataTable(); dt.Load(reader); ...一般的查询是没问题的,但是如果涉及主键列的查询…...
DC-DNS(域名解析服务)(23国赛真题)
2023全国职业院校技能大赛网络系统管理赛项–模块B:服务部署(WindowServer2022) 文章目录 题目配置步骤安装及配置DNS服务。创建正向区域,添加必要的域名解析记录。配置TXT记录,配置域名反向PTR。无法解析的域名统一交由IspSrv进行解析验证配置chinaskills.com正向区域配置…...
日志之Loki详细讲解
文章目录 1 Loki1.1 引言1.2 Loki工作方式1.2.1 日志解析格式1.2.2 日志搜集架构模式1.2.3 Loki部署模式 1.3 服务端部署1.3.1 AllInOne部署模式1.3.1.1 k8s部署1.3.1.2 创建configmap1.3.1.3 创建持久化存储1.3.1.4 创建应用1.3.1.5 验证部署结果 1.3.2 裸机部署 1.4 Promtail…...
Mongodb投射中的$slice,正向反向跳过要搞清楚
在投射中,使用$操作符和$elemMatch返回数组中第一个符合查询条件的元素。而在投射中使用$slice, 能够返回指定数量的数组元素。 定义 投射中使用$slice命令,指定查询结果中返回数组元素的数量。 语法 db.collection.find(<query>,{<arrayFi…...
类和对象 第六部分 继承 第一部分:继承的语法
一.继承的概念 继承是面向对象的三大特性之一 有些类与类之间存在特殊的关系,例如下图: 我们可以发现,下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候,我们可以讨论利用继承的技术,…...
githacker安装详细教程,linux添加环境变量详细教程(见标题三)
笔者是ctf小白,这两天也是遇到.git泄露的题目,需要工具来解决问题,在下载和使用的过程中也是遇到很多问题,写此篇记录经验,以供学习 在本篇标题三中有详细介绍了Linux系统添加环境变量的操作教程,以供学习 …...
2401Idea用GradleKotlin编译Java控制台中文出乱码解决
解决方法 解决方法1 在项目 build.gradle.kts 文件中加入 tasks.withType<JavaCompile> {options.encoding "UTF-8" } tasks.withType<JavaExec> {systemProperty("file.encoding", "utf-8") }经测试, 只加 tasks.withType<…...
Day39 62不同路径 63不同路径II 343整数拆分 96不同的二叉搜索树
62 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&#…...
JavaScript 的 ~~ 运算和floor 的性能差异
在JavaScript中,~~(双波浪号)和Math.floor()都可以用于向下取整,但它们在行为和性能上有一些差异。要测试这两者之间的性能差异,你可以使用JavaScript的performance.now()方法来进行基准测试。 行为差异 Math.floor()…...
AtCoder Beginner Contest 338F - Negative Traveling Salesman【floyd+状态压缩dp】
原题链接:https://atcoder.jp/contests/abc338/tasks/abc338_f Time Limit: 6 sec / Memory Limit: 1024 MB Score: 500 points、 问题陈述 有一个有N个顶点和M条边的加权简单有向图。顶点的编号为 1 到 N,i/th 边的权重为 Wi,从顶点 U…...
UDP/TCP协议特点
1.前置知识 定义应用层协议 1.确定客户端和服务端要传递哪些信息 2.约定传输格式 网络上传输的一般是二进制数据/字符串 结构化数据转二进制/字符串 称为序列化 反之称之为反序列化 下面就是传输层了 在TCP/IP协议中,我们以 目的端口,目的IP 源端口 源IP 协议号这样一个五…...
编程笔记 html5cssjs 059 css多列
编程笔记 html5&css&js 059 css多列 一、CSS3 多列属性二、实例小结 CSS3 可以将文本内容设计成像报纸一样的多列布局. 一、CSS3 多列属性 下表列出了所有 CSS3 的多列属性: 属性 描述 column-count 指定元素应该被分割的列数。 column-fill 指定如何填充…...
Facebook的元宇宙探索:虚拟社交的新时代
近年来,科技的飞速发展推动着人类社交方式的翻天覆地的改变。在这场数字化革命的浪潮中,社交媒体巨头Facebook正积极探索并引领着一个被誉为“元宇宙”的全新领域,试图为用户打造更为真实、丰富的虚拟社交体验。 元宇宙的崛起 元宇宙这个概念…...
用React给XXL-JOB开发一个新皮肤(四):实现用户管理模块
目录 一. 简述二. 模块规划 2.1. 页面规划2.2. 模型实体定义 三. 模块实现 3.1. 用户分页搜索3.2. Modal 配置3.3. 创建用户表单3.4. 修改用户表单3.5. 删除 四. 结束语 一. 简述 上一篇文章我们实现登录页面和管理页面的 Layout 骨架,并对接登录和登出接口。这篇…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
