MongoDB 從零到入門:實用指南

什么是 MongoDB?

MongoDB 是一個流行的非關系型數據庫(NoSQL),它使用類似 JSON 的文檔來存儲數據,而不是傳統的表格形式。這使得 MongoDB 非常靈活,特別適合處理半結構化數據和快速迭代的開發場景。

核心概念

關系型數據庫術語MongoDB 術語
數據庫 (Database)數據庫 (Database)
表 (Table)?集合 (Collection)
行 (Row)?文檔 (Document)

列 (Column)?

字段 (Field)
主鍵 (Primary Key)?ObjectId (_id)

安裝 MongoDB
在 Ubuntu 上安裝

# 導入公鑰
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -# 創建源列表文件
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list# 更新包管理器
sudo apt-get update# 安裝 MongoDB
sudo apt-get install -y mongodb-org# 啟動 MongoDB
sudo systemctl start mongod
sudo systemctl enable mongod

使用 Docker 安裝

docker run -d -p 27017:27017 --name mongodb mongo:latest

在 macOS 上安裝

# 使用 Homebrew
brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb/brew/mongodb-community

在rocky linux上安裝
下載安裝包 mongodb-linux-x86_64-rhel70-4.4.18.tgz

安裝腳本:
mongodb_install.sh

#!/bin/bash# /data/mongodb /{data,logs,conf}dataroot=$1
ver=$2
shardid=$3
# 用法 sh mongodb.sh  目錄 版本 1
setip='0.0.0.0'
if [ $# -ne 3 ];thenecho "Error: please use $0 dataroot ver shardid"exit 1
fi
yum install -y libaio wget telnet net-tools strace gdb lsof sysstat bc numactl grubby chrony traceroute s3cmd zstd jq    libcrypto.so.10 compat-openssl10addcmd(){
addText=$1
file=$2
#判斷 file.sh 文件中是否存在該字符串 # Check whether the character string exists in the file.sh file
if ! grep "$addText" $file  >/dev/null
then
#不存在,添加字符串 # Does not exist, add a stringecho $addText >> $file
else
#存在,不做處理echo $addText" exist in "$file
fi
}
# shardno3rd=`expr $shardid \* 3`
#shardno1st=`expr $shardno3rd - 2`
shardno1st=$shardid
#wget mongodb-linux-x86_64-rhel70-4.4.18.tgz
tar xzvf mongodb-linux-x86_64-rhel70-$ver.tgz -C /opt
ln -snf /opt/mongodb-linux-x86_64-rhel70-$ver /usr/local/mongodb
basedir='/usr/local/mongodb'
datadir=$dataroot'/mongodb/data'
logdir=$dataroot'/mongodb/logs'# rm $datadir/* -rf
mkdir -p $logdir#mkdir -p ${dataroot}/mongodb/config
mkdir ${dataroot}/mongodb/confaddcmd 'export PATH=$PATH:/usr/local/mongodb/bin' ~/.bash_profile
source ~/.bash_profile
groupadd mongodb
useradd -g mongodb mongodb
cat > /usr/lib/systemd/system/mongod_multiple_servers@.service << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
User=mongodb
Group=mongodb
#EnvironmentFile=-$basedir/etc/default/mongod
ExecStart=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_shard%i.yml
ExecStop=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_shard%i.yml --shutdown
PIDFile=$datadir/%i/mongo_%i.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
j=$shardno1st
for ((i=1; i<=j; i++))
domkdir -p $datadir/shard$iif [ ! -f $basedir/conf/mongo_shard$i.yml ]; thentouch ${dataroot}/mongodb/conf/mongo_shard$i.ymlfiport=`expr $i + 40000`cat > ${dataroot}/mongodb/conf/mongo_shard$i.yml << EOF
systemLog:destination: filepath: "$logdir/mongo_shard$i.log"logAppend: truelogRotate: rename
storage:journal:enabled: truecommitIntervalMs: 162dbPath: "$datadir/shard$i"syncPeriodSecs: 67engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 3
processManagement:fork: false
net:bindIp: $setip#注意修改端口  # Notice Modifying the portport: $port
setParameter:enableLocalhostAuthBypass: true
replication:#復制集名稱 # Replication set namereplSetName: "rsshd1"oplogSizeMB: 24576
sharding:#作為分片服務 # As a shard serviceclusterRole: shardsvr
#security:
#  keyFile: "/data/mongodb/conf/keyFile"
#  authorization: enabled
EOF
sed -i "s|`grep cacheSizeGB ${dataroot}/mongodb/conf/mongo_shard$i.yml|sed 's/^[ \t]*//g'`|cacheSizeGB: "$(echo `free -m|grep Mem|awk -F' ' '{print $4}'`*0.85/1000|bc|cut -d'.' -f1)"|g"  ${dataroot}/mongodb/conf/mongo_shard$i.ymlchown -R mongodb:mongodb $dataroot/mongodbchown -R mongodb:mongodb $basedircd $basedirrpath=`pwd -P`chown -R mongodb:mongodb $rpathsystemctl restart mongod_multiple_servers@$i.servicesystemctl enable mongod_multiple_servers@$i.service
done

sh mongodb_install /data 4.4.18 1

基本操作
啟動 MongoDB Shell

mongosh
或
mongo

數據庫操作

// 顯示所有數據庫
show dbs// 使用或創建數據庫
use mydatabase// 查看當前數據庫
db// 刪除當前數據庫
db.dropDatabase()

集合操作

// 創建集合
db.createCollection("users")// 顯示所有集合
show collections// 刪除集合
db.users.drop()

CRUD 操作(創建、讀取、更新、刪除)
創建文檔

// 插入單個文檔
db.users.insertOne({name: "張三",age: 30,email: "zhangsan@example.com",hobbies: ["閱讀", "游泳"],address: {city: "北京",street: "朝陽區"},created_at: new Date()
})// 插入多個文檔
db.users.insertMany([{name: "李四",age: 25,email: "lisi@example.com"},{name: "王五",age: 35,email: "wangwu@example.com"}
])

查詢文檔

// 查詢所有文檔
db.users.find()// 格式化輸出
db.users.find().pretty()// 條件查詢
db.users.find({ age: 30 })
db.users.find({ age: { $gt: 25 } }) // 大于25歲
db.users.find({ age: { $lt: 30 } }) // 小于30歲
db.users.find({ age: { $gte: 25, $lte: 35 } }) // 25到35歲之間// 查詢特定字段
db.users.find({}, { name: 1, email: 1 }) // 只返回name和email字段// 限制結果數量
db.users.find().limit(5)// 排序
db.users.find().sort({ age: 1 }) // 升序
db.users.find().sort({ age: -1 }) // 降序// 復雜查詢
db.users.find({$or: [{ age: { $gt: 30 } },{ name: "張三" }]
})

更新文檔

// 更新單個文檔
db.users.updateOne({ name: "張三" },{ $set: { age: 31 } }
)// 更新多個文檔
db.users.updateMany({ age: { $lt: 30 } },{ $set: { status: "young" } }
)// 增加字段
db.users.updateOne({ name: "張三" },{ $set: { occupation: "工程師" } }
)// 增加數組元素
db.users.updateOne({ name: "張三" },{ $push: { hobbies: "編程" } }
)// 使用增量操作符
db.users.updateOne({ name: "張三" },{ $inc: { age: 1 } } // 年齡加1
)

刪除文檔

// 刪除單個文檔
db.users.deleteOne({ name: "張三" })// 刪除多個文檔
db.users.deleteMany({ age: { $lt: 25 } })

索引優化
創建索引

// 創建單字段索引
db.users.createIndex({ email: 1 }) // 1表示升序,-1表示降序// 創建復合索引
db.users.createIndex({ name: 1, age: -1 })// 創建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })// 查看索引
db.users.getIndexes()// 刪除索引
db.users.dropIndex("email_1")

查詢分析

// 分析查詢性能
db.users.find({ email: "zhangsan@example.com" }).explain("executionStats")

聚合框架

MongoDB 的聚合框架允許對數據進行復雜的處理和轉換。

// 簡單分組統計
db.users.aggregate([{$group: {_id: "$age",count: { $sum: 1 }}}
])// 多階段聚合
db.orders.aggregate([// 階段1: 匹配條件{ $match: { status: "completed" } },// 階段2: 按用戶分組并計算總金額{$group: {_id: "$user_id",total_amount: { $sum: "$amount" },order_count: { $sum: 1 }}},// 階段3: 按總金額排序{ $sort: { total_amount: -1 } },// 階段4: 限制結果數量{ $limit: 10 }
])// 連接查詢(類似SQL的JOIN)
db.orders.aggregate([{$lookup: {from: "users",        // 要連接的表localField: "user_id", // 本地字段foreignField: "_id",   // 外部字段as: "user_info"       // 輸出字段名}}
])

使用 Python 操作 MongoDB
安裝 PyMongo

pip install pymongo

基本操作示例

from pymongo import MongoClient
from datetime import datetime# 連接 MongoDB
client = MongoClient('mongodb://localhost:27017/')# 選擇數據庫
db = client['mydatabase']# 選擇集合
collection = db['users']# 插入文檔
user_data = {"name": "趙六","age": 28,"email": "zhaoliu@example.com","created_at": datetime.now()
}
result = collection.insert_one(user_data)
print(f"插入文檔ID: {result.inserted_id}")# 查詢文檔
user = collection.find_one({"name": "趙六"})
print(f"找到用戶: {user}")# 更新文檔
collection.update_one({"name": "趙六"},{"$set": {"age": 29}}
)# 刪除文檔
collection.delete_one({"name": "趙六"})# 關閉連接
client.close()

高級查詢示例

# 查詢年齡大于25的用戶
users = collection.find({"age": {"$gt": 25}})
for user in users:print(user)# 使用聚合框架
pipeline = [{"$group": {"_id": "$age", "count": {"$sum": 1}}},{"$sort": {"count": -1}}
]
result = collection.aggregate(pipeline)
for item in result:print(f"年齡: {item['_id']}, 人數: {item['count']}")

數據備份與恢復
備份數據庫

# 備份整個數據庫
mongodump --db mydatabase --out /backup/# 備份特定集合
mongodump --db mydatabase --collection users --out /backup/

恢復數據庫

# 恢復整個數據庫
mongorestore --db mydatabase /backup/mydatabase/# 恢復特定集合
mongorestore --db mydatabase --collection users /backup/mydatabase/users.bson

導出為JSON

# 導出集合為JSON
mongoexport --db mydatabase --collection users --out users.json

從JSON導入

# 從JSON導入數據
mongoimport --db mydatabase --collection users --file users.json

安全配置
啟用身份驗證

// 連接到MongoDB
mongosh// 切換到admin數據庫
use admin// 創建管理員用戶
db.createUser({user: "admin",pwd: "securepassword",roles: [ { role: "root", db: "admin" } ]
})// 創建應用用戶
use mydatabase
db.createUser({user: "appuser",pwd: "apppassword",roles: [ { role: "readWrite", db: "mydatabase" } ]
})

配置文件示例
創建 /etc/mongod.conf:

storage:dbPath: /var/lib/mongodbjournal:enabled: truesystemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.lognet:port: 27017bindIp: 127.0.0.1  # 只允許本地連接,生產環境應配置為特定IPsecurity:authorization: enabled  # 啟用身份驗證

性能優化技巧

使用索引:為常用查詢字段創建索引
限制返回字段:只查詢需要的字段
使用投影:減少網絡傳輸數據量
批量操作:使用批量插入/更新操作
適當分片:對于大數據集,考慮使用分片集群

常見問題解決
連接問題

# 處理連接錯誤
from pymongo import MongoClient
from pymongo.errors import ConnectionFailuretry:client = MongoClient('mongodb://localhost:27017/', serverSelectionTimeoutMS=5000)client.admin.command('ismaster')print("連接成功")
except ConnectionFailure:print("無法連接到MongoDB")

處理重復鍵錯誤

from pymongo import MongoClient
from pymongo.errors import DuplicateKeyErrortry:collection.insert_one({"_id": 1, "name": "test"})
except DuplicateKeyError:print("文檔已存在")

總結

MongoDB 是一個功能強大且靈活的 NoSQL 數據庫,適合處理各種類型的數據。通過本文的介紹,您應該已經掌握了:

MongoDB 的基本概念和安裝方法
基本的 CRUD 操作
索引的創建和使用
聚合框架的基本用法
使用 Python 操作 MongoDB
數據備份和恢復
基本的安全配置

要深入學習 MongoDB,建議:
實踐更多復雜的聚合查詢
學習副本集和分片集群的配置
探索 MongoDB Atlas(云服務)
閱讀官方文檔獲取最新功能信息

記住,實踐是最好的學習方式,嘗試在自己的項目中使用 MongoDB,逐步掌握它的高級功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95443.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95443.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95443.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebRTC音頻QoS方法五(音頻變速算法之Expand算法實現)

一、概述介紹在WebRTC中&#xff0c;存在兩種擴展算法&#xff1a;PreemptiveExpand和Expand。盡管這兩種算法的目標都是擴展音頻信號&#xff0c;但它們的實現原理和應用場景卻有所不同。PreemptiveExpand&#xff08;預防性擴張&#xff09;主動擴展策略&#xff0c;旨在防止…

【Python - 基礎 - 工具】解決pycharm“No Python interpreter configured for the project”問題

解決pycharm“No Python interpreter configured for the project”問題 當你在 PyCharm 中遇到“No Python interpreter configured for the project”錯誤時&#xff0c;意味著你的項目沒有配置 Python 解釋器。以下是解決該問題的步驟。 示例 # 嘗試運行代碼時出現錯誤 prin…

Elasticsearch創建索引分片和副本大小建議

在Elasticsearch中&#xff0c;?分片(shard)和副本(replica)? 的設置直接影響集群性能、容錯能力和擴展性。以下是最佳實踐指南&#xff1a;核心概念?類型??描述??是否可修改??主分片(Primary Shard)?數據的最小存儲單元&#xff0c;每個索引被拆分成多個主分片? 索…

“人工智能+虛擬仿真”開啟新學期智慧學習之旅

在教育領域掀起數字化革新浪潮的今天&#xff0c;新學期的開啟不僅意味著知識探索新征程的起步&#xff0c;更蘊含著教育模式深度變革的無限可能。虛擬仿真技術作為教育現代化的關鍵驅動力&#xff0c;正重塑學習體驗&#xff0c;引領教育范式轉移。人工智能與虛擬仿真技術的結…

Photoshop用戶必看:讓你的PSD像JPG一樣可預覽

軟件介紹 Photoshop縮略圖補丁插件3.8.0.96是一款實用的工具&#xff0c;它能夠將PSD格式的文件&#xff08;Photoshop的專用格式&#xff09;以縮略圖的形式顯示出來。這一功能極大地提升了用戶在管理和查找圖像文件時的效率&#xff0c;使得看圖、找圖變得更加輕松便捷。該插…

idea2025.1.5安裝+pj

寫在前邊&#xff1a;如果是卸載舊版本IDEA重裝&#xff0c;一定記得之前的插件啥的&#xff0c;截個圖。還有主題字體設置啥的 目錄背景原因卸載原來版本安裝教程背景原因 原來的2022.2不支持jdk21的語言版本 卸載原來版本 1、如何徹底卸載 IDE, 可參考這篇的文章&#xff…

(四)Python控制結構(條件結構)

程序中的語句默認會按照自上而下的順序逐條執行&#xff0c;但通過一些特定的語句可以更改語句的執行順序&#xff0c;使之產生跳躍、回溯等現象&#xff0c;進而靈活地控制程序的執行流程。控制結構是編程中用于控制程序執行流程的語句&#xff0c;程序的三種基本控制結構為&a…

血緣元數據采集開放標準:OpenLineage Guides 使用 Apache Airflow? 和 OpenLineage + Marquez 入門

OpenLineage 是一個用于元數據和血緣采集的開放標準&#xff0c;專為在作業運行時動態采集數據而設計。它通過統一的命名策略定義了由作業&#xff08;Job&#xff09;、運行實例&#xff08;Run&#xff09;和數據集&#xff08;Dataset&#xff09; 組成的通用模型&#xff0…

FPGA|Quartus II 中使用TCL文件進行引腳一鍵分配

在FPGA設計過程中&#xff0c;合理的引腳分配是確保硬件功能正確實現的關鍵步驟之一。Quartus II 提供了通過 TCL&#xff08;Tool Command Language&#xff09;腳本自動化引腳分配的功能&#xff0c;這不僅可以大大提高設計效率&#xff0c;還能夠確保引腳分配的精確性和可重…

【Docker/Redis】服務端高并發分布式結構演進之路

目錄 概述 常見概念 基本概念 應用&#xff08;Application&#xff09;/ 系統&#xff08;System&#xff09; 模塊&#xff08;Module&#xff09;/ 組件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff09; 集群&#xff08;Cluster&#x…

【Excel】將一個單元格內??的多行文本,??拆分成多個單元格,每個單元格一行??

??所有文本都堆積在“prefix”列頂部的同一個單元格里&#xff08;很可能是B10單元格&#xff09;&#xff0c;并且它們是用空格分隔的&#xff0c;而不是換行符。??因此&#xff0c;您不需要處理換行符&#xff0c;而是需要??按“空格”進行分列&#xff0c;并且將分列后…

新手SEO操作第一步

內容概要 網站優化對于新手而言&#xff0c;常常感覺無從下手。別擔心&#xff0c;這篇文章就是為你量身打造的入門指南。我們將從最基礎也是最重要的關鍵詞研究開始講起&#xff0c;手把手教你如何精準找到目標用戶搜索的詞。掌握了關鍵詞&#xff0c;接下來就是如何創作出搜索…

【高階數據結構】秘法(一)——并查集:探索如何高效地管理集合

前言&#xff1a; 前面我們已經學習了簡單的數據結構&#xff0c;包括棧與隊列、二叉樹、紅黑樹等等&#xff0c;今天我們繼續數據結構的學習&#xff0c;但是難度上會逐漸增大&#xff0c;在高階數據結構中我們要學習的重點是圖等 目錄 一、并查集的原理 二、并查集的基本操作…

spring boot 整合AI教程

1、pom.xml配置<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4…

基于SpringBoot2+Vue2開發的儲物柜管理系統

角色 管理員&#xff1a;管理系統、用戶&#xff0c;管理儲物柜用戶&#xff1a;借用、歸還儲物柜&#xff0c;報修故障 技術棧 后端&#xff1a;Springboot2, JWT, PageHelper前端&#xff1a;Vue2數據庫&#xff1a;MySQL 核心功能 提供智能儲物柜管理&#xff0c;包括用戶注…

uniapp中輸入金額的過濾(只允許輸入數字和小數點)

一、完整代碼&#xff1a; <template><view class"numberIndex" :style"{ paddingTop: navbarHeight px }"><view class"custom-navbar" :style"{ paddingTop: statusBarHeight px }"><view class"navbar…

系統科學核心概念辨析及其在人工智能領域的應用研究:一個整合性分析框架

摘要&#xff1a;本文旨在系統性地梳理和辨析系統科學中的核心概念——結構、功能與層級。文章首先追溯系統思想的理論源流&#xff0c;確立其作為一種超越還原論的整體性研究范式。在此基礎上&#xff0c;深度剖析系統結構的內在構成&#xff08;組分、框架、動態性&#xff0…

Ubuntu環境下刪除Docker鏡像與容器、配置靜態IP地址

刪除Docker鏡像與容器刪除容器&#xff1a;要刪除特定的Docker容器&#xff0c;首先需要停止該容器&#xff1a;docker stop <container_id_or_name>然后可以使用以下命令刪除它&#xff1a;docker rm <container_id_or_name>如果要強制刪除正在運行的容器&#xf…

零樣本視覺模型(DINOv3)

DINOv3是Meta于2025年8月14日發布的第三代自監督視覺基礎模型&#xff0c;通過17億張無標注圖像訓練&#xff0c;參數規模最大達70億&#xff0c;首次在密集預測任務中全面超越弱監督模型&#xff0c;成為計算機視覺領域的里程碑。其核心突破在于無需人工標注即可生成高分辨率密…

【機器學習入門】5.2 回歸的起源——從身高遺傳到線性模型的百年演變

提到 “回歸”&#xff0c;很多剛入門的同學會覺得它是個抽象的數學概念&#xff0c;但你可能想不到&#xff0c;這個術語的誕生&#xff0c;竟然源于 19 世紀一位生物學家對 “身高遺傳” 的研究。回歸分析從 “觀察生物現象” 出發&#xff0c;逐步發展成機器學習中預測連續值…