NoSQL之MongoDB入门实战
简介
Mongo 的BSON数据格式非常适合文档化格式的存储及查询。与传统的RMDB相比
SQL Terms/Concepts | MongoDB Terms/Concepts |
---|---|
database | database |
table | connection |
row | bson document |
column | field |
index | index |
table join | Embedded document and linking |
primary key | ObjectId |
SQL | MongoDB |
---|---|
where/having | $match |
group by | $group |
select | $project |
order by | $sort |
limit | $limit |
count()/sum() | $sum |
安装
Windows安装
下载zip包,exe双击安全即可。注册为Windows服务:
D:\MongoDB\Server\3.4\bin\mongod.exe --service --dbpath D:\MongoDB\data\db --logpath=D:\MongoDB\data\logs\mongodb.log --logappend
启动命令选项:
-- directoryperdb
:每个DB一个文件;
Mac 安装
brew
通过brew来安装,注意这种方式只支持最新版或较新版的MacOS。
brew tap mongodb/brew
brew install mongodb-community@6.0
tar解压安装
cd /usr/local
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz
sudo mv mongodb-osx-x86_64-4.0.9/ mongodb
export PATH=/usr/local/mongodb/bin:$PATH
# 数据存放路径
sudo mkdir -p /usr/local/var/mongodb
# 日志文件路径
sudo mkdir -p /usr/local/var/log/mongodb
# 目录加权限
sudo chown <user> /usr/local/var/mongodb
sudo chown <user> /usr/local/var/log/mongodb
# 启动
/usr/local/mongodb/bin/mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork
# 查看 mongod 服务是否启动
ps aux | grep -v grep | grep mongod
配置MongoDB开机自启
sudo vim /Library/LaunchDaemons/mongodb.plist
加入如下信息:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE plist
PUBLIC '-//Apple//DTD PLIST 1.0//EN'
'[http://www.apple.com/DTDs/PropertyList-1.0.dtd](http://www.apple.com/DTDs/PropertyList-1.0.dtd)'>
<plist version="1.0">
<dict>
<key>Label</key>
<string>mongodb</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/mongodb/bin/mongod</string>
<string>run</string>
<string>--config</string>
<string>/usr/local/mongodb/bin/mongodb.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/mongodb</string>
<key>StandardErrorPath</key>
<string>/usr/local/var/log/mongodb/error.log</string>
<key>StandardOutPath</key>
<string>/usr/local/var/log/mongodb/mongo.log</string>
</dict>
</plist>
其中几个路径信息根据安装情况加以修改。
加入启动进程:sudo launchctl load -w /Library/LaunchDaemons/mongodb.plist
移出启动进程:sudo launchctl unload -w /Library/LaunchDaemons/mongodb.plist
CRUD
修改器
$set
,$inc
,$unset
,$push
,$pushAll
,$addToSet
,$pop
,$pull
,$pullAll
,$(定位器)
自带命令
MongoDB3.4 版本自带以下14个命令行工具:
mongo vs mongod
简单来说,mongod.exe和mongo.exe,前者为服务器(可服务端进程),后者为操作后台(可启动客户端进程)。
mongo客户端,用来连接MongoDB服务器;是一个交互式的js shell,提供一个强大的js 环境,为DBA管理MongoDB,developer查询MongoDB数据提供接口。通过mongo shell和MongoDB进行交互,查询,修改,管理,维护MongoDB的副本集和分片集群。参数–nodb
阻止mongo在启动时连接到数据库实例;
mongod 是MongoDB系统的主要守护进程,用于处理数据请求,数据访问和执行后台管理操作,必须启动,才能访问MongoDB数据库。
mongoperf
mongos
mongodump & mongorestore
二进制数据,不能被直接读取;
mongodump,备份MongoDB数据。该命令可以导出所有数据到指定目录中。命令:mongodump -h dbhost -d dbname -o dbdirectory -u user -p password
mongorestore,恢复备份的数据。命令行:mongorestore -h <hostname><:port> -d dbname <path>
mongoimport & mongoexport
用来做导入和导出数据库;命令:
mongoexport -h host -p port -u username -p passwd
-d
:database 要导出的库
-c
:collection 要导出的collection
-q
:查询条件(用引号包起来)
-o
:导出文件路径
mongostat & mongotop
mongostat是状态检测工具,间隔固定时间获取MongoDB的当前运行状态并输出。
mongotop,用来跟踪一个MongoDB实例,查看哪些读写数据花费大量时间。mongotop提供每个集合的水平的统计数据。命令:mongotop n
,n不设置的话,默认为1;命令mongotop --locks
报告每个数据库的锁的使用情况,输出信息如ns,db(名为 . 的数据库针对全局锁定,而非特定数据库),total,read,write。
其他
bsondump:将bson转换为json
mongooplog:用来做操作日志的回放;oplog是MongoDB复制集中用来记录操作记录的数据集合;
mongofiles:
客户端连接工具
shell
可视化工具
DataGrip
MongoDB Cloud Manager
官方推出的运维自动化管理系统,是企业版才支持的功能,社区用户也可以下载试用。Cloud Manager 主要功能包括:
- MongoDB 集群(复制集、分片)的自动化部署
- 集群监控、及报警定制
- 自动数据备份与还原
MongoDB compass
官方推出的可视化管理工具,企业版才支持,compass 与 Cloud Manager 功能互补,Cloud Manager 偏向于部署、运维、监控,而 compass 则偏向于数据管理、查询优化等,其主要功能包括:
- 数据分布可视化,自动分析各个字段取值的分布情况
- 支持 CRUD 操作
- 索引自动分析及优化建议
- explain 的结果可视化
MongoDB Atlas
官方提供的 DBaaS 服务(Database as a Service),目前支持在 Amazon AWS 上构建 MongoDB 的云服务,未来有可能会支持更多的云厂商(Azure、Alibaba Cloud等)并通过Cloud Manager + compass 来提供可视化的数据管理。
MongoClient
一款开源、跨平台的 mongodb 管理工具,支持 MongoDB 3.2版本,具备数据库监控、gridfs管理、用户管理等功能。
Robomongo/robot 3T
开源,免费的MongoDB管理工具。现改名为robot 3T。
MongoBooster
支持MongoDB 3.2 版本,个人使用免费,用于商业收费。
其他:
mongo-express
adminMongo
MongoVUE
HumongouS.io,在线版,支持移动端,有商业支持。
NoSQL Manager for MongoDB
MongoChef
Mongo Management Studio
至于哪个最好用,仁者见仁;一般而言,商业收费版会好用一些。我个人也并没有使用这里面所有的工具,给不出一个选择项。
参考
driver
本文只考虑java客户端连接工具。
mongo-java-driver
spring-data-mongodb
其他
JSON vs BSON
JSON的局限性,比如它只有null、布尔、数字、字符串、数组和对象这几种数据类型,没有日期类型,只有一种数字类型,无法区分浮点数和整数,也没法表示正则表达式或者函数。BSON是一种类JSON的二进制形式的存储格式,Binary JSON,支持内嵌的文档对象和数组对象,如Date和BinData类型,MongoDB使用BSON做为文档数据存储和网络传输格式。
ObjectId
每次插入一条数据系统都会自动插入一个_id
键,键值不可以重复,它可以是任何类型的,也可以手动的插入,默认情况下它的数据类型是ObjectId,由于MongoDB在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id
的重复(如果使用自增的方式在分布式系统中就会出现重复的_id
的值)。
ObjectId使用12字节的存储空间,每个字节可以存储两个十六进制数字,一共可以存储24个十六进制数字组成的字符串:8位表示时间戳 + 6位机器码 + 4位进程ID + 6位计数器
。
索引种类:
_id
索引、单键索引、多键索引、复合索引、过期索引TTL、全文索引、地理位置索引。
_id
索引:绝大多数集合默认建立的索引;对于每个插入的数据,mongodb都会自动生成一条唯一的_id
字段。- 单键索引:不自动创建,值单一,例如字符串,数字或者日期;
- 多键索引:不自动创建,值有多个,如数组,与单键索引创建形式相同,区别在于字段的值;
- 复合索引:查询条件不只一个时,需要建立复合索引;
- 过期索引:是在一段时间后会过期的索引,索引过期后,相应的数据会删除(不仅仅是索引删除,还有数据);适用场景:在一段时间之后会时效的数据,比如用户的登陆信息、存储的日志;建立方法,
db.test.ensureIndex({time:1},{expireAfterSeconds:10})
秒数。其限制:存储在过期索引字段的值必须是指定的时间类型(ISODate或者其数据,不能使用时间戳,否则不能被自动删除);指定ISODate数组,则按照最小的时间进行删除;过期索引不能是复合索引;删除时间不精确(MongoDB默认60s执行一个删除过程,删除本身也需要时间)
客户端
Spring Data MongoDB
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
实际上引入如下依赖:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
</dependency>
注解:
@Document:标注在实体类上
@CompoundIndexes:复合索引,加复合索引后通过复合索引字段查询将大大提高速度。
@Indexed:加索引。唯一索引@Indexed(unique = true)
。也可以对数组进行索引,如果被索引的列是数组时,mongodb会索引这个数组中的每一个元素。
@Transient:不会被录入到数据库
@Id:MongoDB默认会为每个document生成一个_id
属性,作为默认主键,且默认值为ObjectId,可更改_id
的值(可为空字符串),但每个document必须拥有_id
属性。
@Field:代表一个字段,可以不加,不加的话默认以参数名为列名。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix