新手必看:MongoDB查詢語法基礎

在開始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)

示例:只返回 nameage 字段(排除 _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")

九、注意事項

  1. 條件順序:MongoDB查詢會自動優化順序,無需手動調整。
  2. 性能問題:避免用 skip(n) 實現大數據分頁,可改用基於 _id 的遊標(如 _id > 上次ID)。
  3. 避免全表掃描:查詢時儘量帶上索引字段(如 agename),可大幅提升速度。

十、總結與練習

MongoDB查詢語法核心是“條件+投影+排序+限制”,掌握以下步驟即可入門:
1. 確定查詢條件(等於、比較、邏輯、正則等)。
2. 選擇需要返回的字段(投影)。
3. 用 sort() 排序、limit() 限制結果。

建議:創建一個包含不同字段(字符串、數組、數字)的測試集合,嘗試以下查詢:
- 查詢 age 等於25的用戶,並只返回 name。
- 找出愛好包含 “coding” 且年齡小於25的用戶。
- 按 age 降序,返回前3條結果。

通過實際操作,你會快速熟悉MongoDB的查詢邏輯!

小夜