在Mac上搭建MongoDB环境
最近工作中需要装MongoDB环境,搭建过程中遇到了一些问题,在这里记录一下安装MongoDB环境的方法以及问题的解决方法。有两种安装MongoDB的方法:brew安装和手动安装。
目录
使用Homebrew安装MongoDB
手动安装MongoDB(不使用Homebrew)
两种安装方式对应的卸载方法
执行mongo命令提示command not found
使用Homebrew安装MongoDB
-
安装Homebrew(如果你还没有安装): 打开终端(Terminal)并运行以下命令来安装Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装完成后,运行以下命令以确保Homebrew安装正确:
brew doctor -
通过Homebrew安装MongoDB: MongoDB官方已经不支持通过Homebrew直接安装,但你可以使用第三方tap来安装。在终端运行以下命令:
brew tap mongodb/brew brew install mongodb-community -
启动MongoDB服务: 你可以使用
brew服务来启动MongoDB:brew services start mongodb/brew/mongodb-community这将配置MongoDB作为后台服务启动。执行这条命令遇到了报错:
Error: uninitialized constant Homebrew::Service::System /usr/local/Homebrew/Library/Homebrew/macos_version.rb:150:in `const_missing' /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services/cmd/services.rb:61:in `services' /usr/local/Homebrew/Library/Homebrew/brew.rb:94:in `<main>'
这个错误信息表明在尝试使用Homebrew的
services命令时遇到了问题。Homebrew::Service::System是一个未初始化的常量,这通常意味着Homebrew的某部分没有正确加载或者Homebrew本身可能存在损坏。为了解决这个问题,可以尝试以下几个步骤:(1)更新Homebrew: 运行以下命令以确保Homebrew和所有的tap都是最新的:
brew update brew upgrade(2)检查Homebrew的健康状况: 运行以下命令来检查Homebrew的状态,并修复任何报告的问题:
brew doctor(3)重新启动你的计算机: 有时候,简单地重新启动计算机可以解决临时的系统问题。 以上三步都没有解决我的问题。 (4)重新安装Homebrew服务: 如果更新和修复之后问题仍然存在,尝试卸载Homebrew服务然后重新安装:
brew untap homebrew/services brew tap homebrew/services这一步解决了我的问题。
(5)检查Homebrew的版本: 确保你的Homebrew版本是最新的。运行以下命令查看当前版本:brew --version如果不是最新的,再次运行
brew update。(6)重新安装Homebrew: 如果以上步骤都不能解决问题,你可能需要重新安装Homebrew。首先,备份你当前的Homebrew安装(包括已安装的包),然后根据Homebrew的文档进行重新安装。如果在尝试这些步骤之后问题依然存在,你可能需要查看Homebrew的GitHub仓库中的Issues页面看看是否有其他人遇到了类似的问题,或者创建一个新的Issue求助。 启动mongodb服务成功:
-
验证MongoDB是否正在运行: 在终端运行以下命令来连接MongoDB服务器:
mongo如果MongoDB已经启动,你将看到MongoDB shell的提示符。这一步我又遇到了问题:
qa@QAdeMacBook-Pro ~ % mongo zsh: command not found: mongo这意味着
mongoshell 并不在你的系统 PATH 环境变量中。这通常发生在以下几种情况:(1)MongoDB shell没有安装:在某些情况下,MongoDB服务器和MongoDB shell是分开安装的。确保你已经安装了包含mongoshell的MongoDB包。(2)PATH环境变量未正确设置:当你安装MongoDB时,mongoshell的可执行文件应该位于MongoDB的bin目录中。你需要确保这个目录被添加到了你的PATH环境变量中。解决这个问题的步骤如下:(1)确认mongo shell是否安装: 你可以通过brew list命令检查是否安装了mongoshell:brew list | grep mongo如果这个命令返回了与
mongodb-community相关的结果,那么mongoshell应该已经安装了。
(2)添加MongoDB的bin目录到PATH: 找到MongoDB的安装目录,并将其bin目录添加到你的PATH环境变量中。通常,如果你是通过Homebrew安装的MongoDB,它的bin目录可能位于/usr/local/opt/mongodb-community/bin。你可以通过以下命令将其添加到你的.zshrc文件中:echo 'export PATH="/usr/local/opt/mongodb-community/bin:$PATH"' >> ~/.zshrc然后,运行
source ~/.zshrc来重新加载你的配置,或者重新打开一个终端窗口。(3)验证PATH环境变量: 使用echo $PATH命令来确认PATH环境变量是否包含了MongoDB的bin目录。(4)再次尝试运行mongo shell: 在终端中输入mongo并回车,看看是否能够启动MongoDB shell。如果你按照上述步骤操作后仍然无法运行mongo命令,可能需要重新安装MongoDB shell或者进一步检查你的系统配置。我按照要求设置了环境变量,还是会有这个报错。
如果要停止使用brew services启动的MongoDB服务,你可以执行以下命令:brew services stop mongodb如果你的MongoDB是通过
mongodb-community包安装的,你可能需要执行:brew services stop mongodb-community
如果你想查看所有通过brew services管理的服务的状态,可以使用:brew services list这将列出所有服务及其当前状态(如已启动、已停止等)。这样,你就可以轻松管理你的MongoDB服务以及任何其他使用Homebrew安装的后台服务。
手动安装MongoDB(不使用Homebrew)
-
下载MongoDB: 访问MongoDB官方网站下载页(https://www.mongodb.com/try/download/community),选择适合的版本下载。


-
解压MongoDB压缩包: 下载完成后,解压MongoDB压缩包到一个你选择的目录。
-
配置环境变量: 将MongoDB目录的
bin文件夹添加到你的PATH环境变量中。你可以在~/.bash_profile、~/.zshrc或你的shell配置文件中添加以下行:export PATH=<MongoDB安装目录>/bin:$PATH替换
<MongoDB安装目录>为你的实际安装路径。/Users/qa/Downloads/mongodb-macos-x86_64-7.0.4/bin,export PATH="/Users/qa/Downloads/mongodb-macos-x86_64-7.0.4/bin:$PATH" -
创建数据和日志目录: 默认情况下,MongoDB将数据存储在
/data/db目录中,但你需要手动创建这个目录:sudo mkdir -p /data/db sudo chown `id -un` /data/db你也可以选择其他目录来存储数据,但需要在启动MongoDB时指定。执行sudo mkdir -p /data/db 报错mkdir: /data: Read-only file system。
在macOS上,特别是从Catalina (10.15) 版本开始,系统引入了只读的系统卷,这意味着你不能直接在根目录(
/)下创建或修改文件夹,因此你会遇到 "Read-only file system" 的错误。为了解决这个问题,你可以在用户的主目录或其他非系统保护区域创建数据目录。例如,你可以在你的主目录下创建一个
db目录:(1)打开终端。(2)运行以下命令来创建一个名为mongodb-data的目录(你可以根据自己的需要命名这个目录):mkdir -p ~/mongodb-data(3)然后你需要告诉MongoDB使用这个新的数据目录。当你启动
mongod服务时,使用--dbpath选项指定数据目录的路径:mongod --dbpath ~/mongodb-data
这样,MongoDB就会使用你在主目录下创建的
mongodb-data文件夹来存储数据,而不是默认的/data/db目录。请注意,如果你是通过Homebrew安装的MongoDB,并且希望使用
brew services来管理MongoDB服务,你可能需要修改Homebrew服务的配置文件来指定新的数据目录路径。这通常涉及到编辑MongoDB的plist文件(位于/usr/local/Cellar/mongodb-community/{version}/homebrew.mxcl.mongodb-community.plist,其中{version}需要替换为实际安装的版本号),并在其中添加--dbpath选项。 -
启动MongoDB: 在终端运行以下命令来启动MongoDB:
mongod如果你更改了数据存储目录,使用
--dbpath选项指定路径:mongod --dbpath <你的数据目录路径> -
连接MongoDB: 打开另一个终端窗口,运行以下命令连接MongoDB:
mongo
当我启动mongodb服务时,遇到了错误:
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"E", "c":"CONTROL", "id":20568, "ctx":"initandlisten","msg":"Error setting up listener","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg":"setup bind :: caused by :: Address already in use"}}}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"REPL", "id":4784900, "ctx":"initandlisten","msg":"Stepping down the ReplicationCoordinator for shutdown","attr":{"waitTimeMillis":15000}}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"REPL", "id":4794602, "ctx":"initandlisten","msg":"Attempting to enter quiesce mode"}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"-", "id":6371601, "ctx":"initandlisten","msg":"Shutting down the FLE Crud thread pool"}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"COMMAND", "id":4784901, "ctx":"initandlisten","msg":"Shutting down the MirrorMaestro"}
Error setting up listener
这表明MongoDB服务在尝试绑定到某个网络地址(如localhost)和端口(默认是27017)时遇到了问题。错误的具体内容是:
Address already in use
这意味着MongoDB服务尝试绑定的端口已经被其他进程占用了。在大多数情况下,这是因为另一个MongoDB实例已经在运行,或者有其他服务正在使用该端口。
要解决这个问题,你可以采取以下步骤:
-
查找占用端口的进程:你可以使用
lsof或netstat命令来查找哪个进程正在使用27017端口。例如:lsof -i :27017或者
netstat -anp | grep 27017这将列出所有使用27017端口的进程信息。

-
结束占用端口的进程:如果确定是MongoDB的另一个实例占用了端口,并且你确定要关闭它,你可以使用
kill命令来结束该进程。例如:kill <PID>其中
<PID>是占用端口的进程ID。 -
重新启动MongoDB服务:在结束占用端口的进程之后,你可以尝试再次启动MongoDB服务:
mongod --dbpath ~/mongodb-data
以上就是在Mac上搭建MongoDB环境的基本步骤。如果有任何问题,可以参考MongoDB的官方文档或者在安装过程中查看终端中的错误信息。
两种安装方式对应的卸载方法
如果你在电脑上既使用Homebrew安装了MongoDB,又手动安装了MongoDB,并为它们配置了不同的环境变量,可能会遇到以下问题:
-
端口冲突:MongoDB默认使用27017端口。如果两个MongoDB实例都尝试使用同一个端口,那么后启动的实例将无法绑定到该端口上,因为它已经被第一个实例占用了。
-
配置混淆:如果你为两个MongoDB实例设置了不同的环境变量,可能会导致运行时的配置混淆。例如,当你尝试启动或与MongoDB交互时,你可能不确定正在使用哪个版本的MongoDB实例。
-
路径冲突:如果两个MongoDB实例配置的数据目录或日志目录相同,可能会导致数据覆盖或损坏。
-
版本冲突:如果两个MongoDB实例的版本不同,可能会导致客户端工具、驱动程序或应用程序与MongoDB实例的兼容性问题。
-
管理复杂性:维护两个MongoDB实例意味着你需要记住两套配置、两个不同的命令集以及两个服务的启动和停止方式,这增加了管理的复杂性。
为了避免这些问题,建议你选择一种安装方式,并且坚持使用它:
-
如果选择Homebrew:你可以通过
brew services管理MongoDB服务,并且依赖Homebrew来处理版本更新和路径配置。 -
如果选择手动安装:你需要自己管理MongoDB的启动、停止、配置和更新。
卸载用Homebrew安装的MongoDB,可以运行:
brew services stop mongodb
brew uninstall mongodb
如果你想删除手动安装的MongoDB,你需要停止服务(如果它正在运行),然后删除MongoDB的文件夹和配置文件。
在做出决定之前,请确保备份所有重要的数据,以免在卸载过程中丢失。
执行mongo命令提示command not found
首先想到的原因是没有配置环境变量会有这个问题,
即使你已经配置过环境变量,这可能是由以下原因引起的:
-
环境变量未生效:你可能在配置文件中正确设置了环境变量,但是更改可能还没有生效。你可以通过关闭并重新打开你的终端窗口来刷新环境变量,或者在当前终端中运行
source ~/.bash_profile(或对应的配置文件,比如~/.zshrc或~/.bashrc等,取决于你使用的shell)来使更改立即生效。 -
错误的环境变量路径:你可能在环境变量中设置了错误的路径。检查你的
.bash_profile、.bashrc、.zshrc或其他shell配置文件中的PATH环境变量,确保它包含了MongoDB的可执行文件目录。对于Homebrew安装的MongoDB,它通常位于/usr/local/bin目录中。 -
配置文件未加载:如果你使用的是非常规的shell或者有特殊的配置,可能你的环境变量配置文件(如
.bash_profile、.bashrc、.zshrc等)没有被加载。确保你在正确的文件中添加了环境变量,并且这个文件在你的shell启动时会被读取。 -
多个MongoDB版本:由于你提到电脑上同时用brew安装了MongoDB,也手动安装了MongoDB,可能存在多个版本的MongoDB。确保你的
PATH环境变量指向的是你想要使用的MongoDB版本的路径。 -
权限问题:可能是由于权限问题导致的。确认
mongo命令的可执行文件是否具有适当的执行权限。 -
Shell不识别更改:如果你使用的是zsh而不是bash,你需要在
.zshrc而不是.bash_profile中设置环境变量。
你可以通过执行以下命令来确认mongo命令的位置:
which mongo

或者查找系统中所有mongo命令的位置:
find / -name mongo 2>/dev/null
如果以上命令返回了mongo命令的路径,确保这个路径被包含在你的PATH环境变量中。如果命令没有返回任何路径,那么可能你的MongoDB没有安装正确,或者mongo命令的路径没有被加入到PATH中。
一旦你找到了正确的mongo命令路径,你可以通过以下命令将它添加到你的PATH环境变量中(假设mongo命令位于/path/to/mongo/bin):
export PATH="/path/to/mongo/bin:$PATH"
然后将这行添加到你的shell配置文件中(.bash_profile、.bashrc、.zshrc等),保存文件,并重新加载配置或重启你的终端。
相关文章:
在Mac上搭建MongoDB环境
最近工作中需要装MongoDB环境,搭建过程中遇到了一些问题,在这里记录一下安装MongoDB环境的方法以及问题的解决方法。有两种安装MongoDB的方法:brew安装和手动安装。 目录 使用Homebrew安装MongoDB 手动安装MongoDB(不使用Homebr…...
第三十九天| 62.不同路径、63. 不同路径 II
Leetcode 62.不同路径 题目链接:62 不同路径 题干:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “…...
提高代码质量的 10 条编码原则
提高代码质量的 10 条编码原则 本文转自 公众号 ByteByteGo,如有侵权,请联系,立即删除 今天来聊聊提高代码质量的 10 条编码原则。 软件开发需要良好的系统设计和编码标准。我们在下图中列出了 10 条良好的编码原则。 01 遵循代码规范 我们…...
SHERlocked93 的 2017 年终总结
回家的路上有点无聊,简短回顾一下2017年的得失收获 开始两个月3月到5月用C#完结了一个烂尾的wpf小项目,对自己前半年的.net生涯也算是一个句号(虽然不知道最后有没有采用),后面由于项目组转变技术栈,选择了…...
【FreeRTOS基础入门】任务通知
文章目录 前言一、任务通知介绍1.1 任务通知怎么通信1.2 任务通知与其他通信方式的区别1.3 优势及限制任务通知的优势任务通知的限制 1.4 内部原理 二、任务通知的使用2.1 发出与接收通知简化版2.1 发出与接收通知专业版 总结 前言 FreeRTOS 提供了丰富而灵活的任务通知机制&a…...
python opencv比较图片相似度
目录 一:均值哈希算法 二:三直方图算法 三:单通道直方图 一:均值哈希算法 均值哈希算法是一种快速比较图像相似度的方法。它首先将图像转化为灰度图像,然后计算图像的均值,接着将每个像素的...
校园兼职|大学生校园兼职小程序|基于微信小程序的大学生校园兼职系统设计与实现(源码+数据库+文档)
大学生校园兼职小程序目录 目录 基于微信小程序的大学生校园兼职系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户微信端功能模块 2、管理员服务端功能模块 (1) 兼职管理 (2)论坛管理 (3&…...
linux系统离线安装docker服务教程
1、下载、上传docker-20.10.0.tgz压缩包至服务器,其中,docker下载地址https://download.docker.com/linux/static/stable/x86_64/ 2、新建安装docker脚本docker-install.sh #!/usr/bin/env bash tar -xvf docker-20.10.0.tgzcp docker/* /usr/bin/cat …...
【青龙】快速搭建青龙面板,部署属于你自己的应用!
青龙面板是一个支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。 废话不多说,直接开始。 这里使用一台 雨云 的云服务器作为演示。雨云注册地址:https://www.rainyun.com/ 优惠码:lz932 使用优惠码注册后绑定微信可获得8折…...
shell脚本实现Mysql分库分表备份
一.数据库的分库分表? 12张图把分库分表讲的明明白白!阿里面试:我们为什么要分库分表https://mp.weixin.qq.com/s?__bizMzU0OTE4MzYzMw&mid2247547792&idx2&sn91a10823ceab0cb9db26e22783343deb&chksmfbb1b26eccc63b784879…...
【算法 - 动态规划】从零开始学动态规划!(总纲)
动态规划 动态规划(Dynamic Programming,DP)是一种优化问题求解方法,通常用于解决具有 重叠子问题 和 最优子结构 性质的问题。它的基本思想是将原问题分解成更小的子问题,通过求解和保存这些子问题的解,避…...
从 Elasticsearch 到 Apache Doris,统一日志检索与报表分析,360 企业安全浏览器的数据架构升级实践
导读:随着 360 企业安全浏览器用户规模的不断扩张,浏览器短时间内会产生大量的日志数据。为了提供更好的日志数据服务,360 企业安全浏览器设计了统一运维管理平台,并引入 Apache Doris 替代了 Elasticsearch,实现日志检…...
【力扣 - 二叉树的直径】
题目描述 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示: 树中节点数目在范围 [1, 10000] 内…...
大数据,对于生活的改变
谷歌通过对于疾病的查询量可以预测一个个h1n1病毒的大爆发, 大数据时代对于人的考验 用户的搜索记录就是一种信息,这种信息会满足其基础相关的词条与其有关的词条(最为原始的搜索机制,国内的搜索引擎都是采用这种基础原理。&…...
py2neo和neo4j
py2neo 和 neo4j 是两个 Python 中与 Neo4j 图数据库交互的库,但它们有不同的设计和使用方式。 py2neo: 类型: py2neo 是一个面向对象的库,提供了一个对象模型,使得与 Neo4j 数据库的交互更加 Pythonic。API 风格: 使用 Node 和 Relationship…...
解决windows无法访问wsl下docker服务
笔者在初学使用wsl跑docker时,遇到了windows无法访问的问题,并且浏览了大部分的文章,发现并没有起效,在反复试错终于成功之后,总结为以下几点: 1.升级至wsl2 2.将.wslconfig文件(用户文件夹下)中的如下镜像服务关闭删除 networkingModemirrored 3.打开wsl防火墙相应的端口 …...
OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)
Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…...
Python第十九章(模块)
系统的模块库一般处于外部库中的Lib里面 一。导入模块的方式: 1.方式一: 导入:import 模块名1,模块名2 调用:模块名 . 功能名() 2.方式二: 导入:from 模块名 import 功能1,功能…...
【Linux网络编程五】Tcp套接字编程(四个版本服务器编写)
【Linux网络编程五】Tcp套接字编程(四个版本服务器编写) [Tcp套接字编程]一.服务器端进程:1.创建套接字2.绑定网络信息3.设置监听状态4.获取新连接5.根据新连接进行通信 二.客户端进程:1.创建套接字2.连接服务器套接字3.连接成功后进行通信 三…...
APP 有漏洞被测要下架,怎么处理?
事情的经过是这样的: 1:学员公司测试的 APP 发现有漏洞,被要求下架 2:他被公司要求去查询 APP 哪里有漏洞 3:他来寻求帮助,推荐几款安全测试扫描漏洞的问题。 事情的梳理: 1:我们看了他的 …...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
