MongoDB安装配置实战:三大平台部署与常见异常排查指南
发布时间:2026/10/2 1:43:17来源:尧图网络
说的直白点MongoDB安装这件事一半人搜教程是因为第一次接触根本不知道从哪下另一半人是下完了装不上、装上了连不上、连上了没多久又被各种报错劝退。我自己也是从这套流程里爬过来的最初照着网上教程装个MongoDB前后折腾了大半天最后发现坑都踩在版本不匹配和配置文件上跟数据库本身没关系。这篇不说废话直接把我从安装到跑通、再到排查常见异常的完整过程拆给你看覆盖三大平台的安装方式、安装必须做的配置调整、基础增删改查以及那些让你头疼的list嵌套list查询、fassert()崩溃、聚合统计和安全认证适合刚入门MongoDB的朋友也适合那些装了N次都没成功的“反复挣扎型选手”。1. 安装前的核心决策别急着动手先选对方案很多人一上来就复制粘贴安装命令结果装到一半才发现下载的版本和系统架构对不上或者选错了安装方式后面卸载重装来回摩擦。磨刀不误砍柴工安装前花十分钟搞清楚版本和安装方式后面能省一天。1.1 版本怎么挑社区版、企业版与版本号解读打开MongoDB官网的下载页面你首先会面对两个选择Community Server和Enterprise Server。对绝大多数个人开发者、学习者和中小企业项目来说社区版完全够用协议也更宽松随意部署功能上覆盖了日常用的CRUD、聚合、索引、副本集和分片。企业版多了LDAP集成、Kerberos认证、磁盘加密这些偏运维和安全审计的能力普通业务用不上试用期过后还得买授权所以我的建议很直接不差预算的上企业版其余一律选社区版。版本号这块是新手最容易懵的。MongoDB的版本命名遵循X.Y.Z的结构其中Y是偶数代表稳定版比如7.0、6.0Y是奇数代表开发版比如6.1、6.3开发版仅供学习和预览特性绝不应该用在生产环境。再往上一点5.0、6.0、7.0这些主版本之间数据文件格式和内部协议可能会有变化升级的时候需要走官方支持的升级路径不能跨大版本直接跳。另外要注意一个细节从5.0开始MongoDB改为每年一个大版本但每个版本的生命周期和兼容性信息都在官方文档的Version Compatibility表格里安装前顺手点开看一眼能避免后面对接驱动时版本对不上。我踩过的坑就是第一次下载时没看系统是ARM还是x86直接拿了一个x86_64的安装包往自己M系列芯片的Mac上装结果各种启动异常。所以下载前请先确认三件事你的操作系统Windows/Linux/macOS、CPU架构x86_64还是arm64、你要装稳定版还是开发版。这三个问题定下来安装方案就清晰了。1.2 三种安装方式横向对比包管理器、压缩包、DockerMongoDB的安装方式粗分三条路线系统包管理器、官方压缩包、Docker容器。这三条路线各有利弊适配不同场景用一句话概括就是包管理器最省心压缩包最可控Docker最干净。安装方式适用场景优点缺点包管理器apt/yum/brew本机快速开发、Linux服务器命令简单、依赖自动处理、升级方便仓库源版本可能滞后卸载后残留配置官方压缩包tarball/zip生产环境定制部署、离线安装完全可控可指定任意版本目录可随意迁移需要手动配置环境变量和服务脚本Docker容器开发测试、微服务架构、CI环境环境隔离、秒级启动、随用随删、多版本共存数据持久化要额外配置卷网络模式需了解个人建议如果你是在自己的电脑上学习练手包管理器是最省事的如果你在搭生产环境或者需要精确定制安装路径用压缩包如果你的项目本身就在容器环境里跑那直接用Docker镜像。这三种方式不冲突我自己的开发机是Docker跑一个MongoDB做测试宿主机再用压缩包方式装了一份供日常调试两者数据目录完全隔离互不干扰。这里要特别提醒一下别再去找那些“一键安装脚本”或者不知名渠道的安装包。MongoDB官方提供了一个mongodb-org的仓库包管理方式的安装源直接指向官方仓库压缩包也从官网或官方镜像站下载就好。来历不明的二进制分发包一是可能携带恶意代码二是版本乱七八糟出了问题你都不知道该找谁。数据库是存储数据的基础设施安装这事洁癖一点不为过。1.3 为什么我建议先想清楚安装目录和权限MongoDB不像MySQL那样自带一个初始化向导它的目录结构、数据目录、日志目录在安装后默认散落如果不规划好后面启动时会因为权限问题、磁盘空间不足问题折腾你半天。我从实践出发建议你安装前就想好三个路径安装目录、数据目录、日志目录。安装目录存放二进制文件的路径比如Windows下的D:\MongoDBLinux下的/usr/local/mongodb。这个目录需要你当前用户可读可执行。数据目录存放数据库文件的路径比如D:\MongoDB\data或/var/lib/mongodb。这个目录是MongoDB写入的核心目录必须保证启动MongoDB的进程用户对它拥有写权限否则启动直接报错。日志目录存放运行日志的路径比如D:\MongoDB\log或/var/log/mongodb。日志不仅用于排错还被logrotate等工具轮转建议单独分配。这三个路径如果都用默认值在Windows上往往会出现数据目录不存在导致起不来在Linux上经常遇到以root启动后数据文件权限被占坑后面切普通用户又起不来的窘境。我个人的经验是安装前先mkdir -p建好目录再明确启动用户最后启动前用ls -l确认权限这一套动作下来后面基本遇不到“莫名其妙的权限错误”。2. 实操安装三大平台逐步复现这一章我把Windows、Linux、Docker三种场景的安装过程完整过一遍每一步都写清楚操作意图和容易出错的地方。你根据自己的环境挑着看但建议三步都扫一眼因为很多概念是通用的。2.1 Windows压缩包安装最稳妥的路径Windows下最常见的安装方式是下载官方zip压缩包解压然后手动配置。为什么不推荐.msi安装包原因是.msi安装过程会以Windows服务形式注册但默认数据目录路径经常带空格或权限受限后续想自定义配置反而不灵活。zip包方式解压后所有东西都在一个目录里想删就删想挪就挪干净利落。先打开MongoDB官网下载中心选择Community Server选Windows选对应的版本和zip包下载。解压到比如D:\MongoDB你会看到bin目录下有mongod.exe和mongos.exe等可执行文件。这时打开命令提示符建议以管理员身份运行CMD执行cd D:\MongoDB mkdir data mkdir log echo log\mongodb.log第一行进入安装根目录后三行创建数据目录、日志目录和一个空的日志文件。为什么创建日志文件这一步容易忽略因为mongod启动时如果日志文件不存在在某些配置下有可能会因为文件读写权限问题报错提前创建能规避这个坑。接着启动MongoDB服务前台启动方式最简单D:\MongoDB\bin\mongod.exe --dbpath D:\MongoDB\data --logpath D:\MongoDB\log\mongodb.log这个命令表示数据目录指向刚创建的data目录日志写入mongodb.log前台启动时你会看到类似“Waiting for connections”的输出说明服务已经正常工作。但这样的启动方式有个问题关闭CMD窗口MongoDB也跟着退出。想让它在后台常驻可以再敲一行命令注册成Windows服务D:\MongoDB\bin\mongod.exe --dbpath D:\MongoDB\data --logpath D:\MongoDB\log\mongodb.log --install --serviceName MongoDB注意--install参数需要管理员权限而且不能和前台运行参数混用。注册成功后通过net start MongoDB启动服务通过net stop MongoDB停止服务。Windows安装最容易踩的坑有三个一是没以管理员身份运行导致服务注册失败二是系统缺少VC运行库启动时直接弹“找不到VCRUNTIME140.dll”这个去微软官方装最新的Visual C Redistributable就好三是防火墙弹窗询问是否允许mongod联网如果只想本机访问直接取消忽略就行不影响使用。2.2 Linux包管理器安装apt与yum的差异在Linux上用官方仓库安装是最省心的。需要注意官方仓库源和系统自带的源不是一回事很多教程让你直接“apt install mongodb”这装的是系统自带的老旧版本甚至可能是已经被移除的mongodb包版本混乱的一塌糊涂。正确姿势是先添加官方源。以Ubuntu/Debian使用apt为例先导入MongoDB公钥sudo apt-get install gnupg curl curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor然后创建源列表文件/etc/apt/sources.list.d/mongodb-org-7.0.listecho deb [ archamd64,arm64 signed-by/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list注意这里有两个容易错的地方一是版本号7.0要和你要装的版本一致如果你想装6.0就把命令里的7.0全部替换成6.0二是“jammy”是你的Ubuntu发行版代号不同系统代号不一样查一下uname -a或者lsb_release -a确认。源添加后执行更新和安装sudo apt-get update sudo apt-get install -y mongodb-org安装完成后systemd服务脚本已经自动生成直接sudo systemctl start mongod sudo systemctl enable mongod如果是CentOS/RHEL这类用yum/dnf的系统第一步导入公钥sudo rpm --import https://www.mongodb.org/static/pgp/server-7.0.asc然后创建/etc/yum.repos.d/mongodb-org-7.0.repo写入[mongodb-org-7.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp/server-7.0.asc接着sudo yum install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongodapt和yum两条路线的核心差别就在仓库配置上。装完之后用systemctl status mongod确认运行状态正常会显示“active (running)”。如果显示Active: failed或者进程启动后一直重启大概率是/etc/mongod.conf里配置的数据目录路径权限不对执行ls -ld /var/lib/mongo看看属主是不是mongod用户不是就chown -R mongod:mongod /var/lib/mongo修正。2.3 Docker容器化安装开发环境的最优解Docker方式安装MongoDB本质上就是拉镜像、跑容器整个过程不到一分钟。如果你电脑上已经有Docker这是体验MongoDB最快的方式尤其适合那些不想在自己系统里留下任何痕迹的洁癖型开发者。先拉官方镜像版本号建议写成明确的主版本而不是latest比如docker pull mongo:7.0然后启动容器这里要着重注意数据持久化的问题。如果直接docker run mongo:7.0跑起来容器一删数据就全没了。所以启动时要把容器内的数据目录挂载到宿主机上docker run -d \ --name mongodb \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORDadmin123456 \ -v mongodb_data:/data/db \ mongo:7.0这条命令的每个参数都有含义-d表示后台运行--name是容器别名-p把宿主机的27017端口映射到容器的27017-e设置初始管理员账号密码-v声明了一个名为mongodb_data的匿名卷挂载到容器内的/data/db目录。这里顺便说一句官方镜像支持通过环境变量创建初始管理员用户比容器起来后再手动创建方便得多但是如果你用这种方式创建了用户MongoDB会默认开启认证后续所有客户端连接都需要账号密码。Docker方式的坑集中在两个点一是端口冲突宿主机已经跑了一个MongoDB实例占用27017的情况下容器启动会报端口被占用解决办法是把宿主机映射端口改掉比如-p 37017:27017二是容器时区和宿主机不一致日志时间可能对不上调试可以在docker run的时候加上-e TZAsia/Shanghai。还有一点生产环境不建议用Docker方式跑单节点MongoDB除非你连卷、网络、备份方案都安排得明明白白否则数据的持久化和IO性能会让人头大。2.4 mongod.conf配置文件安装完必做的三个调整不管用哪种方式安装MongoDB都默认附带了一个配置文件mongod.conf。它是YAML格式决定了进程启动时的行为。很多人安装后直接用默认配置跑起来能用但有几个地方我是强烈建议立刻调整的。第一个必调项是bindIp。默认配置里这一项是127.0.0.1意味着只有本机能连接MongoDB这在安全角度是好事但如果你需要从局域网里的另一台机器连过来就必须改成0.0.0.0或者指定具体的内网IP。改法net: port: 27017 bindIp: 0.0.0.0注意改成0.0.0.0等于监听所有网卡意味着暴露在网络的任意设备都能访问这个端口所以紧接着要做第二个调整——开启认证。security: authorization: enabled这是生产环境绝对不能漏的安全配置。默认情况下MongoDB没有任何访问控制任何人都能连上来读写数据等于数据库裸奔在网络上。开启认证后连接时需要提供用户名密码后面第四章会专门讲怎么创建用户和启用认证。开发学习阶段你可以先不开认证但一旦部署到服务器上第一件事就是把它打开。第三个调整是系统日志和文件描述符。Linux环境下如果系统日志里看到大量“MongoDB has reached the max file limit”的告警需要在/etc/mongod.conf里把systemLog里destination和logAppend配好systemLog: destination: file path: /var/log/mongodb/mongod.log logAppend: true同时把Linux的系统文件描述符上限调大否则并发连接一高MongoDB会直接拒绝新连接。在/etc/security/limits.conf里加上mongod soft nofile 64000 mongod hard nofile 64000或者如果你的系统用systemd管理在mongod.service文件里加LimitNOFILE64000。文件描述符问题在开发环境几乎不会遇到但放在这里是因为很多人把开发环境的配置原封不动搬到生产环境后就会踩这一下。3. 安装验收与数据库基本操作安装完成不等于结束验证安装、学会基本操作才算把这条路走通。这一章从如何确认服务正常开始再到实际跑通增删改查最后专门说一说热词里那个“list嵌套list”的查询问题。3.1 验证安装是否成功mongod启动与mongosh连接服务启动后第一件事是验证进程是否正常监听端口。Linux下执行sudo systemctl status mongod ss -lntp | grep 27017看到mongod进程监听了27017端口说明服务层没问题。Windows下直接看服务状态或者netstat -ano | findstr 27017。Docker方式验证看容器状态docker ps | grep mongodb docker logs mongodb --tail 20服务跑起来后需要客户端工具连上去。这里有个大坑老版本的客户端工具叫mongo从MongoDB 6.0之后官方把客户端工具改名为mongoshMongoDB Shell很多老教程里的mongo命令在新版本上已经不存在了。如果安装的是完整版MongoDB包mongosh一般会被一并安装如果你用的是Linux的精简版或者Docker镜像可能要单独装mongosh。安装mongosh最直接的方式是在官方下载中心找到MongoDB Shell按照对应平台安装。Ubuntu下也可以直接用官方仓库安装sudo apt-get install -y mongodb-mongosh装好后连接本机MongoDBmongosh mongodb://localhost:27017连接成功后你会看到mongosh的交互提示符“test”说明安装验证通过。如果连接报错先检查服务是否在运行、端口是否被占用、bindIp是否允许本机连接。这三个问题排查完90%的连接失败都能解决。3.2 数据库基本操作从建库到增删改查连上mongosh之后就可以体验MongoDB的核心操作了。先明确一个概念MongoDB的“数据库”和“集合”是延迟创建的第一次写入数据时才会真正创建。也就是说不用像MySQL那样先CREATE DATABASE直接use一个库名再insert一条数据库和集合就自动出来了。use shop db.users.insertOne({ name: 张三, age: 25, tags: [会员, 华东区], orders: [ { item: 手机, price: 2999 }, { item: 耳机, price: 399 } ] })这条命令执行后返回一个包含insertedId的对象说明写入成功。use shop切换到了shop数据库insertOne向users集合插入了一条文档。MongoDB里的文档是BSON格式理解成JSON对象就行比关系型数据库的行要灵活得多字段类型不用预先定义每条文档的长度、字段甚至可以不一样。查询操作是日常使用频率最高的。基本查询用finddb.users.find() db.users.find({ age: { $gt: 20 } }) db.users.find({ tags: 会员 }) db.users.find({}, { name: 1, age: 1, _id: 0 })第一条查所有文档第二条查age大于20的文档第三条查tags数组里包含“会员”的文档第四条做字段投影只返回name和age字段并且不显示_id。find返回的是游标在mongosh里会直接打印最多20条结果如果数据多输入it继续下一页。更新操作主要用updateOne和updateManydb.users.updateOne( { name: 张三 }, { $set: { age: 26 } } ) db.users.updateMany( { age: { $lt: 30 } }, { $inc: { score: 10 } } )$set是设置字段值$inc是自增。这里要提醒一个新手最常犯的错误updateOne的第二个参数必须包含更新操作符$set、$inc等如果你直接写成db.users.updateOne({name:张三}, {age: 26})MongoDB会报错不会像MySQL那样整行替换。删除操作db.users.deleteOne({ name: 张三 }) db.users.deleteMany({})deleteMany({})会清空集合里所有文档操作前想清楚。这个命令没有确认提示执行了就回不来了生产环境务必谨慎。3.3 嵌套数组list嵌套list怎么查点号路径与$elemMatch“mongodb怎么查list嵌套list”这个热词说明很多人卡在了嵌套数组查询上。MongoDB的文档模型允许数组嵌套对象也能嵌套数组查询方式比想象中灵活但用错了就很容易漏数据。先定义一个含嵌套数组的集合示例use shop2 db.students.insertMany([ { name: 李雷, scores: [ { subject: 数学, grade: 90 }, { subject: 英语, grade: 80 } ] }, { name: 韩梅梅, scores: [ { subject: 数学, grade: 75 }, { subject: 物理, grade: 92 } ] } ])最常用的查询方式是用点号路径直接深入到嵌套数组元素的字段db.students.find({ scores.subject: 数学 }) // 返回李雷和韩梅梅因为两个人的scores数组里都有subject等于数学的元素这条命令的语义是检查scores数组中的每个对象只要其中任意一个对象的subject字段等于“数学”整个文档就被匹配。注意点号路径字段名不需要加引号但把它整个作为字符串放在查询条件里。如果查询条件要同时匹配数组里同一个元素的多个字段点号路径就不够用了因为它无法保证“同一元素内同时满足”。比如查“scores数组中存在一个元素它的subject是数学且grade是90”如果写成db.students.find({ scores.subject: 数学, scores.grade: 90 })这条命令会匹配到scores数组中任一元素subject为数学、另一个元素grade为90的文档也就是说即使数学成绩不是90只要英语成绩是90它也会被匹配。这就产生了误匹配。要精确匹配同一个数组元素的多字段条件必须用$elemMatchdb.students.find({ scores: { $elemMatch: { subject: 数学, grade: 90 } } }) // 只有李雷满足条件$elemMatch要求数组里至少有一个元素同时满足花括号内的所有条件。这是嵌套数组多条件查询的标准姿势强烈建议牢记。数组嵌套数组的情况类似比如字段matrix: [[1, 2], [3, 4]]查询所有包含3的子数组可以用db.collection.find({matrix: 3})因为MongoDB会对数组内容进行递归匹配如果需要按索引查第一个元素可以写matrix.0这些都是点号路径的延伸用法。4. 安装失败与运行异常的排查实录能走到这一章说明你前面的安装基本成功了或者至少你已经准备好面对那些防不胜防的报错。我把自己实际遇到过的经典问题整理成了一份速查表再挑几个高频大头单独展开。4.1 安装失败高发场景速查表报错现象根因解决方案“error while loading shared libraries: libcrypto.so.1.1”系统缺少OpenSSL依赖库安装对应版本的libssl1.1或升级系统依赖“Data directory /data/db not found.”mongod启动时数据目录不存在手动mkdir创建数据目录并指定--dbpath“Attempted to create a lock file on a read-only directory”启动用户对数据目录无写权限chown -R mongod:mongod 数据目录或改用有权限用户“Address already in use”27017端口被其他进程占用找到占用进程并结束或修改mongod配置的port“MongoDB Shell not found / mongo: command not found”新版MongoDB不再自带旧版mongo客户端单独安装mongosh或用旧的mongo包“Unauthorized” / “command requires authentication”开启认证后未提供用户凭证连接使用账号密码连接或先关闭认证恢复访问“REPLICATION ROUTER” / mongos启动异常用了mongos而不是mongod把mongos命令换成mongod除非你在搭分片集群“BadValue: bindIp cannot be 0.0.0.0 with auth enabled”某些版本禁止绑定所有IP时关闭认证要么指定具体IP要么开启认证这张表是我把这几年在技术社区看到的求助帖和自己经历过的问题汇总出来的覆盖面比较广。遇到报错时第一优先级永远是去翻日志文件日志会告诉你真正的原因比在搜索引擎里大海捞针效率高得多。Windows的日志在配置的log文件里Linux在/var/log/mongodb/mongod.logDocker用docker logs mongodb查看。还有一个高频坑值得单独说系统时间错误。MongoDB节点之间同步依赖时间如果本机时间和实际时间差距过大副本集成员之间会无法通信单个节点也可能在认证时出现奇怪问题。Linux下及时执行ntpdate或者systemctl start chronyd校准时间这个细节常被忽略但影响巨大。4.2 认识fassert()MongoDB异常崩溃时的断言错误热词里出现了“mongodb fassert()”这是很多人在MongoDB进程突然挂掉后搜日志时看到的关键词。fassert是MongoDB内部的一种断言机制直白说就是程序检测到某种不可恢复的内部错误状态主动触发断言失败直接终止进程避免在错误状态上继续运行导致更严重的数据损坏。你不需要看懂fassert的源码实现但你必须会看日志里的上下文因为日志会告诉你断言的原因是啥。一个典型的崩溃日志形如F 2024-01-01T12:00:00.0000800 I - [conn1] Fatal Assertion 50853 F 2024-01-01T12:00:00.0000800 I - [conn1] ***aborting after invariant() failure***这里的50853是一个断言代码每个代码对应一类错误。看到这种日志第一反应不是去网上翻代码表而是去日志里往上翻几行找“F”级别日志之前最近的那几条EError级别输出那才是引发断言的真正原因。以我的实际经历fassert()崩溃最常见的原因有三种一是数据文件损坏比如磁盘坏道、突然断电、非正常kill进程导致WiredTiger存储引擎的数据文件与日志不一致二是数据文件版本不匹配比如MongoDB从6.0降级回5.0时旧版本读取不了新版本的存储格式触发断言主动退出三是磁盘空间耗尽WiredTiger在写入过程中发现无法分配新的存储空间系统会走断言保护路径。遇到fassert()崩溃按这三步处理第一步先停掉MongoDB服务把整个数据目录备份一份这一步能不做尽量不要省后续操作有风险但备份了就有后悔药第二步查看数据目录所在磁盘空间空间满了立刻清理第三步尝试用mongod --repair启动一次修复数据文件mongod --dbpath /var/lib/mongo --repair这个命令会重新扫描并修复数据文件的内部一致性。注意repair操作必须在没有任何mongod实例运行的前提下执行否则会提示数据目录已被锁定。修复完成后再正常启动。如果连repair都失败那只能从最近的备份恢复数据了这也是为什么我一直强调——数据库的数据备份比安装本身更重要。4.3 简单聚合查询快速上手统计操作聚合环节是热词“mongodb之聚合函数查询统计”指向的重点。MongoDB的聚合框架Aggregation Pipeline用管道方式处理数据每一阶段把处理后的结果交给下一个阶段最典型的应用就是分组统计。假设有一个订单集合记录了每笔订单的状态和金额use shop3 db.orders.insertMany([ { user: 张三, status: completed, amount: 100 }, { user: 李四, status: pending, amount: 50 }, { user: 张三, status: completed, amount: 200 }, { user: 王五, status: cancelled, amount: 30 } ])想按用户统计每个人的总消费金额db.orders.aggregate([ { $group: { _id: $user, total: { $sum: $amount } } } ])$group是聚合框架里最核心的阶段_id指定按哪个字段分组$sum累加字段值。执行结果会按user分组算出每个用户的总金额。如果想过滤掉已取消的订单再加一个$match阶段db.orders.aggregate([ { $match: { status: completed } }, { $group: { _id: $user, total: { $sum: $amount }, count: { $sum: 1 } } }, { $sort: { total: -1 } } ])这个管道的执行顺序是先过滤status等于completed的订单再按user分组并同时统计总金额和订单数量最后按总金额降序排序。管道的每阶段顺序很重要$match放在越前面越好因为它能提前减少数据量提升后续阶段的处理性能。常用聚合操作符还有几个$count统计数量$avg计算平均值$min和$max求极值$unwind把数组字段拆成多条文档。比如要统计每个商品被购买的次数先把orders里的items数组拆开再分组db.orders.aggregate([ { $unwind: $items }, { $group: { _id: $items.name, totalCount: { $sum: $items.quantity } } } ])聚合管道的能力远不止这些但要先掌握$match、$group、$sort、$unwind这四板斧日常80%的统计需求都能靠它们解决。逻辑上跟MySQL的GROUP BY、WHERE、ORDER BY做一个对比会更容易理解$match相当于WHERE筛选$group相当于GROUP BY分组和聚合函数$sort就是ORDER BY。4.4 数据库安全入门创建用户并开启认证最后一块拼图是安全。像我前面说的MongoDB默认安装完成之后是不需要认证的只要能连上端口就能读写全部数据。这个特性在学习环境无所谓但一旦你的MongoDB跑在云服务器或者宿主机对外开放的端口上不设置认证等于把你的数据裸奔在公网上那些扫描端口的程序几小时之内就能发现它。先进入admin数据库创建一个管理员用户use admin db.createUser({ user: admin, pwd: 你的强密码, roles: [ { role: root, db: admin } ] })root角色相当于超级管理员拥有操作所有数据库的全部权限。创建成功后修改配置文件启用认证Linux下编辑/etc/mongod.confWindows编辑mongod.cfg加上security: authorization: enabled保存后重启服务sudo systemctl restart mongod之后连接MongoDB就必须提供账号密码了mongosh mongodb://admin:你的强密码localhost:27017/admin?authSourceadmin注意authSource指定了认证数据库是admin因为admin用户是在admin库下创建的。如果是Docker方式前面提到用-e MONGO_INITDB_ROOT_USERNAME和-e MONGO_INITDB_ROOT_PASSWORD环境变量启动的容器已经默认开启了认证无需额外配置。除了创建用户和开启认证还有两个安全建议顺手做了一是把27017端口尽量通过对端防火墙限制来源IP不要对全公网开放二是MongoDB连接串里不要用明文密码保存生产环境可以用环境变量或密钥管理服务。这两个习惯能帮你规避掉大多数扫描和爆破风险。说到底MongoDB安装这件事真正值钱的经验不是那个安装命令而是安装前后你对自己系统和数据目录的理解。从我个人的体验来说第一遍安装如果不做规划遇到的每个报错都像拦路虎可一旦你装成功一次把从启动到查询、从权限到认证这条链路走通了后面再碰MongoDB的任何部署都会顺手很多。安装过程中的那些坑并不可怕它只是用报错逼着你把一个数据库系统真正读懂。最后再给你一个建议不管装到哪一步只要报错先看日志再看配置最后再去网上搜这个排查顺序能让你少走太多弯路。
网站建设高端定制企业官网