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 骨架,并对接登录和登出接口。这篇…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...