Python Playwright UI自动化测试环境完全配置指南:从零搭建到CI集成
2026/6/26 5:43:07
MongoDB是目前最主流的文档型NoSQL数据库,简单说就是“以JSON格式存数据的数据库”,不用提前建表、改结构灵活,特别适配快速迭代的业务(比如电商、社交、AI场景)。下面用通俗的语言拆解它的核心概念、用法和适用场景。
先对比传统关系型数据库(比如MySQL),你就懂MongoDB的优势了:
| 维度 | MySQL(关系型) | MongoDB(文档型) |
|---|---|---|
| 数据格式 | 二维表(行+列),需提前建表/字段 | BSON(JSON的二进制扩展),无固定结构 |
| 扩展方式 | 垂直扩展(升级服务器)为主 | 水平扩展(加服务器)为主,天然适配分布式 |
| 事务支持 | 强事务(ACID),支持多表事务 | 单文档事务(默认),4.0+支持多文档事务 |
| 查询灵活性 | 结构化查询,需符合表结构 | 支持嵌套查询、数组查询,灵活度高 |
| 适用场景 | 数据结构固定(比如财务、订单) | 数据结构多变(比如用户画像、日志) |
核心特点总结:
age,另一条可以没有);新手最容易懵的是术语差异,直接对应看:
| MySQL术语 | MongoDB术语 | 大白话解释 |
|---|---|---|
| 数据库(Database) | 数据库(Database) | 一样!比如test_db既是MySQL库也是MongoDB库 |
| 表(Table) | 集合(Collection) | 存放同类文档的“容器”,相当于MySQL的表,但无结构限制 |
| 行(Row) | 文档(Document) | 单条数据,JSON格式(实际存BSON) |
| 列(Column) | 字段(Field) | 文档里的键值对,比如"name": "张三" |
| 主键(Primary Key) | _id字段 | 每个文档默认自带的唯一标识,MongoDB自动生成(也可以自定义) |
| 索引(Index) | 索引(Index) | 一样!支持单字段、复合、地理空间等索引 |
举个例子:
MySQL里用户表(user)的一行数据:
| id | name | age | address |
|---|---|---|---|
| 1 | 张三 | 20 | 北京市朝阳区 |
MongoDB里user集合的一个文档(BSON格式):
{"_id":ObjectId("66ff7a7b8c9d4832e078b456"),// MongoDB自动生成的唯一ID"name":"张三","age":20,"address":{// 嵌套文档"province":"北京","city":"朝阳","street":"XX路"},"hobbies":["篮球","游戏"]// 数组字段}可以看到:支持嵌套字段(address)、数组字段(hobbies),这是MySQL很难做到的(需要多表关联)。
先装MongoDB(本地/云服务),连接后用mongo/mongosh命令行操作,核心操作如下:
# 切换/创建数据库(不存在则自动创建)use test_db# 创建集合(可选,插入数据时会自动创建)db.createCollection("user")# 查看当前库的所有集合show collections# 删除集合db.user.drop()# 删除数据库db.dropDatabase()# 插入单条文档db.user.insertOne({"name":"张三","age":20,"address":{"province":"北京","city":"朝阳"},"hobbies":["篮球","游戏"]})# 插入多条文档db.user.insertMany([{"name":"李四","age":25,"hobbies":["读书"]},{"name":"王五","age":30,"address":{"province":"上海"}}])注意:插入时如果user集合不存在,会自动创建;_id字段如果不指定,MongoDB会生成唯一的ObjectId。
这是MongoDB的核心优势,支持各种灵活查询:
# 1. 查询所有文档(慎用!数据量大时会卡)db.user.find()# 2. 条件查询:年龄=20db.user.find({"age":20})# 3. 条件查询:年龄>20(MongoDB用特殊操作符)db.user.find({"age":{"$gt":20}})# $gt=大于,$lt=小于,$gte=大于等于# 4. 嵌套文档查询:地址里的省份=北京db.user.find({"address.province":"北京"})# 5. 数组查询:爱好包含篮球db.user.find({"hobbies":"篮球"})# 6. 只返回指定字段(比如只返回name和age,_id默认返回,用0关闭)db.user.find({"age":{"$gt":20}},{"name":1,"age":1,"_id":0})# 7. 排序:按年龄降序(1=升序,-1=降序)db.user.find().sort({"age":-1})# 8. 分页:跳过1条,取2条(对应MySQL的limit offset)db.user.find().skip(1).limit(2)# 9. 统计数量db.user.countDocuments({"age":{"$gt":20}})# 1. 更新单条文档:把张三的年龄改成21db.user.updateOne({"name":"张三"},# 查询条件{"$set":{"age":21}}# 更新操作($set=设置字段,不影响其他字段))# 2. 更新多条文档:年龄>20的用户,添加字段"status": "active"db.user.updateMany({"age":{"$gt":20}},{"$set":{"status":"active"}})# 3. 替换整个文档(慎用!会覆盖所有字段,除了_id)db.user.replaceOne({"name":"张三"},{"name":"张三","age":21,"gender":"男"}# 新文档)# 删除单条文档db.user.deleteOne({"name":"张三"})# 删除多条文档db.user.deleteMany({"age":{"$lt":25}})和MySQL一样,没有索引的查询会全表扫描,MongoDB支持多种索引:
# 1. 创建单字段索引(年龄字段,升序)db.user.createIndex({"age":1})# 2. 创建复合索引(name+age)db.user.createIndex({"name":1,"age":-1})# 3. 创建唯一索引(name字段不能重复)db.user.createIndex({"name":1},{"unique":true})# 查看索引db.user.getIndexes()# 删除索引db.user.dropIndex("age_1")类似MySQL的group by,但功能更强,支持多阶段处理:
# 按省份统计用户数量db.user.aggregate([{"$match":{"address.province":{"$exists":true}}},# 过滤:有省份字段的文档{"$group":{"_id":"$address.province","count":{"$sum":1}}}# 分组统计])结果会返回:
[{"_id":"北京","count":1},{"_id":"上海","count":1}]当单节点存不下/处理不了数据时,MongoDB可以分片(把数据拆分到多个服务器):
MongoDB 4.0+支持多文档事务,用法类似MySQL:
# 开启事务session=db.getMongo().startSession()session.startTransaction()# 事务内操作db.user.updateOne({"name":"张三"},{"$set":{"age":22}},{"session":session})db.order.insertOne({"userId":"张三","amount":100},{"session":session})# 提交事务(失败则调用session.abortTransaction())session.commitTransaction()MongoDB的设计思想是“以文档为中心”,放弃了关系型数据库的严格结构,换来极致的灵活性和扩展能力。
简单说:
新手入门建议:先装本地MongoDB,用mongosh命令行练CRUD,再学索引和聚合,最后了解副本集/分片集群(生产环境必备)。