一份面向开发者的 mongodb 6.0 实战指南,涵盖核心概念、安装部署、crud 操作、数据类型详解及 spring boot 整合实践。
一、mongodb 是什么?
mongodb 是一款文档型数据库,使用 json/bson 作为数据模型,由 c++ 编写,专为 web 应用提供可扩展、高性能的数据存储方案。
它介于关系型数据库与非关系型数据库之间,是 nosql 阵营中功能最丰富、最像 rdbms 的产品。其核心特点:
- 半结构化:同一集合中的文档可以拥有不同字段,无需预先定义 schema。
- 弱关系:没有外键约束,通过聚合管道(
$lookup)实现类似表连接的功能。 - 强大的查询语言:支持索引、聚合、地理空间查询等,能完成大多数单表查询操作。
- 原生高可用与水平扩展:通过复制集提供 99.999% 高可用,通过分片实现海量数据无缝扩容。
截至 2021 年底,mongodb 在数据库总排名第 5,nosql 中排名第 1,社区活跃度和应用广度持续攀升。
二、mongodb vs 关系型数据库(概念对照)
| mongodb 概念 | 关系型数据库概念 |
|---|---|
| 数据库(database) | 数据库 |
| 集合(collection) | 表(table) |
| 文档(document) | 行(row) |
| 字段(field) | 列(column) |
| 索引(index) | 索引 |
_id | 主键(primary key) |
| 视图(view) | 视图 |
$lookup | 表连接(join) |
注意:mongodb 的文档支持嵌套和数组,更贴合面向对象的编程模型,开发效率更高。
三、适用场景
只要满足以下任意一项,就可以考虑使用 mongodb:
- 游戏:用户信息、装备、积分以内嵌文档存储,方便查询更新。
- 物流:订单状态变更以数组存储,一次查询获取完整轨迹。
- 社交:用户信息、朋友圈,配合地理位置索引实现“附近的人”。
- 物联网:设备信息、日志存储,并进行多维分析。
- 视频直播:用户、礼物等实时数据。
- 大数据:作为云存储系统,方便数据提取分析。
国内外众多互联网公司(如阿里、腾讯、google、facebook 等)都在生产环境中广泛使用 mongodb。
四、linux 环境搭建(centos 7)
1. 下载并解压 mongodb community server
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.5.tgz tar -zxvf mongodb-linux-x86_64-rhel70-6.0.5.tgz
2. 创建数据目录和日志文件
mkdir -p /mongodb/data /mongodb/log touch /mongodb/log/mongodb.log
3. 启动 mongodb(命令行方式)
bin/mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --bind_ip=0.0.0.0 --fork
4. 使用配置文件启动(推荐)
创建 /mongodb/conf/mongo.conf:
systemlog:
destination: file
path: /mongodb/log/mongod.log
logappend: true
storage:
dbpath: /mongodb/data
engine: wiredtiger
journal:
enabled: true
net:
bindip: 0.0.0.0
port: 27017
processmanagement:
fork: true启动:
mongod -f /mongodb/conf/mongo.conf
5. 关闭 mongodb
# 方式一 mongod --port=27017 --dbpath=/mongodb/data --shutdown # 方式二(进入 mongosh) use admin db.shutdownserver()
6. 安装 mongosh(mongodb 6.0 已移除旧的 mongo 客户端)
wget https://downloads.mongodb.com/compass/mongodb-mongosh-1.8.0.x86_64.rpm yum install -y mongodb-mongosh-1.8.0.x86_64.rpm
连接:
mongosh --host=192.168.65.206 --port=27017
五、安全认证(用户管理)
1. 创建管理员用户(在 admin 库中)
use admin
db.createuser({user: "fox", pwd: "fox", roles: ["root"]})2. 创建应用数据库用户
use appdb
db.createuser({user: "appdb", pwd: "fox", roles: ["dbowner"]})3. 启用认证启动
mongod -f /mongodb/conf/mongo.conf --auth
4. 连接时认证
mongosh 192.168.65.206:27017 -u fox -p fox --authenticationdatabase=admin
六、docker 安装(快速体验)
docker pull mongo:6.0.5 docker run --name mongo-server -p 29017:27017 \ -e mongo_initdb_root_username=fox \ -e mongo_initdb_root_password=fox \ -d mongo:6.0.5 --wiredtigercachesizegb 1
连接:
mongosh ip:29017 -u fox -p fox
七、核心文档操作(crud)
1. 插入文档
// 插入单个
db.books.insertone({ title: "mongodb实战", type: "technology", favcount: 30 })
// 批量插入(可用 load("books.js") 执行脚本)
db.books.insertmany([...])2. 查询文档
// 查询所有
db.books.find()
// 条件查询(收藏数 > 60)
db.books.find({ type: "travel", favcount: { $gt: 60 } })
// 正则匹配
db.books.find({ type: { $regex: "so" } })
// 排序 + 分页
db.books.find().sort({ favcount: -1 }).skip(16).limit(8)
// 巧分页(避免 skip 大数据量)
db.books.find({ _id: { $gt: lastid } }).sort({ _id: 1 }).limit(10)3. 更新文档
// 更新单个(自增收藏数)
db.books.updateone({ _id: objectid("...") }, { $inc: { favcount: 1 } })
// 更新多个(添加发布时间)
db.books.updatemany({ type: "novel" }, { $set: { publisheddate: new date() } })
// upsert(不存在则插入)
db.books.updateone(
{ title: "my book" },
{ $set: { tags: ["nosql"], type: "none" } },
{ upsert: true }
)4. 删除文档
db.books.deleteone({ type: "novel" })
db.books.deletemany({ type: "novel" })
db.books.findoneanddelete({ type: "novel" }) // 返回被删文档5. 批量操作(bulkwrite)
db.pizzas.bulkwrite([
{ insertone: { document: { _id: 3, type: "beef", price: 6 } } },
{ updateone: { filter: { type: "cheese" }, update: { $set: { price: 8 } } } },
{ deleteone: { filter: { type: "pepperoni" } } }
])八、bson 数据类型与 objectid
为什么使用 bson?
- 二进制编码,遍历更快(记录每个元素长度,支持 seek 直接读取)。
- 支持更丰富的类型:日期、二进制、objectid、decimal128 等。
- 文档最大 16mb,嵌套级别不超过 100。
objectid 结构(12 字节)
- 4 字节:unix 时间戳(秒)
- 5 字节:随机数(机器号 + 进程号)
- 3 字节:计数器(初始随机)
自动生成,保证唯一性,减轻服务器压力。
日期类型
mongodb 使用 utc 时间存储,new date() 和 isodate() 均生成 isodate 类型。
九、内嵌文档与数组(灵活建模)
内嵌文档示例
db.books.insert({
title: "撒哈拉的故事",
author: { name: "三毛", gender: "女", hometown: "重庆" }
})
// 查询
db.books.find({ "author.name": "三毛" })
// 更新内嵌字段
db.books.updateone({ "author.name": "三毛" }, { $set: { "author.hometown": "重庆/台湾" } })数组操作
// 添加标签
db.books.updateone({ "author.name": "三毛" }, { $push: { tags: "猎奇" } })
// 批量添加并保留最后 3 个
db.books.updateone(
{ "author.name": "三毛" },
{ $push: { tags: { $each: ["伤感", "想象力"], $slice: -3 } } }
)
// 根据数组元素查询
db.books.find({ tags: "伤感" })
db.books.find({ tags: { $all: ["伤感", "想象力"] } })多属性商品(数组内嵌文档)
db.goods.insertmany([{
name: "羽绒服",
tags: [
{ tagkey: "size", tagvalue: ["m","l","xl"] },
{ tagkey: "color", tagvalue: ["黑色","宝蓝"] }
]
}])
// 查询 color=黑色 且 size=xl
db.goods.find({
tags: {
$all: [
{ $elemmatch: { tagkey: "color", tagvalue: "黑色" } },
{ $elemmatch: { tagkey: "size", tagvalue: "xl" } }
]
}
})十、固定集合(capped collection)
固定集合是限定大小的集合,采用 fifo(先进先出)策略,适用于日志、消息队列、最新 topn 等场景。
// 创建(size=4096字节,max=10条)
db.createcollection("logs", { capped: true, size: 4096, max: 10 })
// 普通集合转固定集合
db.runcommand({ converttocapped: "mycoll", size: 100000 })实战:股票消息队列
生产者每秒插入一条股价变动:
function pushevent() {
while (true) {
db.stock_queue.insert({
timestamped: new date(),
stock: "mongodb inc",
price: 100 * math.random()
});
sleep(1000);
}
}消费者持续监听(类似 tail -f):
function listen() {
var cursor = db.stock_queue.find({ timestamped: { $gte: new date() } }).tailable();
while (true) {
if (cursor.hasnext()) {
print(json.stringify(cursor.next(), null, 2));
}
sleep(1000);
}
}十一、spring boot 整合 mongodb
1. 引入依赖
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-mongodb</artifactid>
</dependency>2. 配置 yml
spring:
data:
mongodb:
uri: mongodb://fox:fox@192.168.65.174:27017/test?authsource=admin3. 实体类(使用注解)
@document("emp")
@data
public class employee {
@id
private integer id;
@field("username")
private string name;
@field
private int age;
@field
private double salary;
@field
private date entryday;
}4. 常用操作示例
插入:
mongotemplate.insert(employee); mongotemplate.insert(list, employee.class);
查询:
// 条件 + 排序 + 分页
query query = new query(criteria.where("salary").gt(4000).lt(10000))
.with(sort.by(sort.order.desc("salary")))
.skip(0).limit(4);
list<employee> list = mongotemplate.find(query, employee.class);更新:
query query = new query(criteria.where("salary").is(15000));
update update = new update().set("salary", 13000);
updateresult result = mongotemplate.updatemulti(query, update, employee.class);删除:
query query = new query(criteria.where("salary").is(10000));
mongotemplate.remove(query, employee.class);5. 去掉自动添加的_class字段(可选)
@configuration
public class mongoconfig {
@bean
public mappingmongoconverter mappingmongoconverter(
mongodatabasefactory factory, mongomappingcontext context, mongocustomconversions conversions) {
dbrefresolver resolver = new defaultdbrefresolver(factory);
mappingmongoconverter converter = new mappingmongoconverter(resolver, context);
converter.setcustomconversions(conversions);
converter.settypemapper(new defaultmongotypemapper(null)); // 关键
return converter;
}
}十二、小结
mongodb 以其灵活的文档模型、强大的查询能力、原生高可用与扩展性,成为 nosql 领域的领军者。无论是快速迭代的互联网产品,还是海量数据的物联网、大数据场景,mongodb 都能显著降低开发成本,提升系统弹性。
本文从概念到实战,从 linux 安装到 spring boot 整合,覆盖了日常开发所需的全部基础知识。希望你能以此为起点,在项目中充分发挥 mongodb 的优势。
到此这篇关于mongodb快速实战与基本原理入门教程的文章就介绍到这了,更多相关mongodb基本原理入门内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论