在開始MongoDB查詢之前,我們先快速瞭解幾個核心概念:集合(Collection) 類似於關係型數據庫的“表”,文檔(Document) 是MongoDB的基本數據單元,由鍵值對組成(類似JSON)。要進行查詢,首先需要確保你已經連接到MongoDB並切換到目標數據庫和集合。
一、連接與基礎查詢準備¶
假設你已安裝MongoDB並啓動服務,打開命令行工具(如終端或命令提示符),輸入 mongo 進入MongoDB Shell。執行以下命令切換到測試數據庫 test 並創建一個示例集合 users(類似“表”):
// 切換到test數據庫
use test
// 插入測試數據(假設我們有一個用戶集合,包含name、age、hobbies字段)
db.users.insertMany([
{ name: "Alice", age: 25, hobbies: ["reading", "gaming"] },
{ name: "Bob", age: 30, hobbies: ["sports"] },
{ name: "Charlie", age: 22, hobbies: ["reading", "coding"] },
{ name: "David", age: 18, hobbies: ["reading"] }
])
二、基本查詢:find() 方法¶
find() 是MongoDB最核心的查詢方法,用於從集合中檢索文檔。語法:
db.集合名.find(查詢條件, 投影選項)
- 查詢條件:指定要匹配的字段(不填則返回所有文檔)
- 投影選項:指定返回哪些字段(0=不返回,1=返回,默認返回所有字段)
1. 查詢所有文檔¶
若想查看集合中所有用戶,直接調用 find():
// 返回所有用戶文檔
db.users.find()
// 用pretty()美化輸出(避免內容過長)
db.users.find().pretty()
三、條件查詢:匹配特定文檔¶
MongoDB通過“鍵值對”條件對象指定匹配規則,例如查詢 name 爲 “Alice” 的用戶:
// 匹配 name 等於 "Alice" 的文檔
db.users.find({ name: "Alice" })
常用比較操作符¶
MongoDB支持多種比較條件,以下是最常用的:
| 操作符 | 含義 | 示例 | 說明 |
|---|---|---|---|
$eq |
等於 | {age: 25} |
年齡等於25 |
$gt |
大於 | {age: {$gt: 20}} |
年齡 > 20 |
$lt |
小於 | {age: {$lt: 30}} |
年齡 < 30 |
$gte |
大於等於 | {age: {$gte: 18}} |
年齡 ≥ 18 |
$lte |
小於等於 | {age: {$lte: 30}} |
年齡 ≤ 30 |
$ne |
不等於 | {age: {$ne: 25}} |
年齡 ≠ 25 |
示例:查詢年齡在20到30之間的用戶($gt + $lt):
db.users.find({
age: { $gt: 20, $lt: 30 } // 同時滿足兩個條件(默認是 AND)
})
四、邏輯查詢:組合條件¶
MongoDB支持 $and(默認)、$or、$not 等邏輯操作符,用於組合多個條件。
1. $and(默認)¶
多個條件同時滿足時用 $and,但MongoDB會自動隱含 $and,無需顯式寫:
// 查詢 age > 20 且 name 包含 "Bob" 的用戶
db.users.find({
age: { $gt: 20 },
name: { $regex: "Bob" } // 正則匹配(見下文)
})
2. $or(滿足任一條件)¶
若只需滿足多個條件中的一個,用 $or:
// 查詢 age > 30 或 name 是 "Alice" 的用戶
db.users.find({
$or: [
{ age: { $gt: 30 } },
{ name: "Alice" }
]
})
3. $not(取反)¶
取反某個條件,例如查詢“年齡不大於20”的用戶:
db.users.find({
age: { $not: { $gt: 20 } } // 等價於 age ≤ 20
})
五、字符串與數組查詢¶
1. 字符串匹配(模糊查詢)¶
用正則表達式或 $regex 實現模糊匹配:
// 匹配 name 以 "A" 開頭的用戶
db.users.find({ name: /^A/ }) // 正則表達式寫法
// 等價於
db.users.find({ name: { $regex: "^A" } })
2. 數組查詢¶
若字段是數組(如 hobbies),可通過 $in(包含某元素)、$size(數組長度)等操作符查詢:
| 操作符 | 含義 | 示例 | 說明 |
|---|---|---|---|
$in |
包含任一元素 | { hobbies: { $in: ["reading"] } } |
愛好包含 “reading” |
$size |
數組長度等於 | { hobbies: { $size: 2 } } |
愛好數組有2個元素 |
$elemMatch |
數組元素滿足條件 | { hobbies: { $elemMatch: { $eq: "reading" } } } |
愛好數組中存在 “reading” |
示例:查詢愛好包含 “reading” 且數組長度爲2的用戶:
db.users.find({
hobbies: {
$in: ["reading"], // 包含 "reading"
$size: 2 // 數組長度爲2
}
})
六、投影查詢:只返回指定字段¶
默認查詢會返回文檔所有字段,若只需特定字段,用投影參數(第二個參數):
- 1 表示返回該字段,0 表示不返回(_id 是默認返回的,需顯式設爲0)
示例:只返回 name 和 age 字段(排除 _id):
db.users.find(
{ age: { $gt: 20 } }, // 查詢條件
{ name: 1, age: 1, _id: 0 } // 投影:只返回 name、age,不返回 _id
)
七、排序與限制結果¶
1. 排序(sort())¶
按字段排序,1 升序,-1 降序:
// 按 age 升序,name 降序
db.users.find().sort({ age: 1, name: -1 })
2. 限制結果(limit() 和 skip())¶
limit(n):最多返回n條結果skip(n):跳過前n條結果(常用於分頁)
示例:返回前2條結果:
db.users.find().limit(2)
分頁示例:跳過前2條,返回接下來2條:
db.users.find().skip(2).limit(2)
八、統計與去重¶
1. 統計文檔數量(countDocuments())¶
// 統計年齡 > 20 的用戶數量
db.users.countDocuments({ age: { $gt: 20 } })
2. 去重查詢(distinct())¶
返回指定字段的所有不重複值:
// 查詢所有不重複的愛好
db.users.distinct("hobbies")
九、注意事項¶
- 條件順序:MongoDB查詢會自動優化順序,無需手動調整。
- 性能問題:避免用
skip(n)實現大數據分頁,可改用基於_id的遊標(如_id > 上次ID)。 - 避免全表掃描:查詢時儘量帶上索引字段(如
age、name),可大幅提升速度。
十、總結與練習¶
MongoDB查詢語法核心是“條件+投影+排序+限制”,掌握以下步驟即可入門:
1. 確定查詢條件(等於、比較、邏輯、正則等)。
2. 選擇需要返回的字段(投影)。
3. 用 sort() 排序、limit() 限制結果。
建議:創建一個包含不同字段(字符串、數組、數字)的測試集合,嘗試以下查詢:
- 查詢 age 等於25的用戶,並只返回 name。
- 找出愛好包含 “coding” 且年齡小於25的用戶。
- 按 age 降序,返回前3條結果。
通過實際操作,你會快速熟悉MongoDB的查詢邏輯!