MongoDB條件查詢:從簡單到複雜的查詢示例

在MongoDB中,條件查詢是從集合中篩選數據的核心操作。通過指定不同的條件,我們可以精確地獲取符合需求的文檔。本文將從簡單到複雜,用具體示例講解MongoDB的條件查詢方法,適合初學者快速上手。

一、準備示例數據

爲了方便演示,我們假設有一個名爲users的集合,包含以下文檔(可理解爲用戶信息表):

{
  "_id": 1,
  "name": "Alice",
  "age": 25,
  "hobbies": ["reading", "hiking"],
  "address": { "city": "Beijing", "country": "China" }
},
{
  "_id": 2,
  "name": "Bob",
  "age": 30,
  "hobbies": ["gaming", "coding"],
  "address": { "city": "Shanghai", "country": "China" }
},
{
  "_id": 3,
  "name": "Charlie",
  "age": 22,
  "hobbies": ["music", "sports"],
  "address": { "city": "Guangzhou", "country": "China" }
},
{
  "_id": 4,
  "name": "David",
  "age": 35,
  "hobbies": ["travel", "photography"],
  "address": { "city": "Chengdu", "country": "China" }
}

二、基礎條件查詢(最簡單的“等於”條件)

MongoDB中,條件查詢通過find()方法實現,條件以“鍵值對”的形式寫在查詢文檔中。最基礎的條件是等於,即查詢某個字段等於指定值的文檔。

示例1:查詢年齡爲25的用戶

db.users.find({ age: 25 })
  • 解釋{ age: 25 }是查詢條件,表示“年齡字段等於25”。
  • 結果:返回_id爲1的文檔(Alice的信息)。

示例2:查詢城市爲“Shanghai”的用戶

db.users.find({ "address.city": "Shanghai" })
  • 解釋address.city是嵌套字段的點表示法(address是父文檔,city是子字段),表示查詢地址中城市爲“Shanghai”的文檔。
  • 結果:返回_id爲2的文檔(Bob的信息)。

三、比較運算符(大於、小於、不等於等)

MongoDB支持多種比較運算符,用於更靈活的條件篩選,常見的有:
- $gt:大於(greater than)
- $lt:小於(less than)
- $gte:大於等於(greater than or equal)
- $lte:小於等於(less than or equal)
- $ne:不等於(not equal)

示例3:查詢年齡大於25歲的用戶

db.users.find({ age: { $gt: 25 } })
  • 解釋{ age: { $gt: 25 } }表示“年齡字段大於25”。
  • 結果:返回_id爲2(Bob,30歲)、4(David,35歲)的文檔。

示例4:查詢年齡在22到30歲之間的用戶(含22和30)

db.users.find({ age: { $gte: 22, $lte: 30 } })
  • 解釋:條件是一個對象,包含$gte(大於等於)和$lte(小於等於),表示年齡範圍在22到30之間。
  • 結果:返回_id爲1(25歲)、2(30歲)、3(22歲)的文檔。

示例5:查詢姓名不等於“Bob”的用戶

db.users.find({ name: { $ne: "Bob" } })
  • 解釋$ne表示“不等於”,即排除姓名爲“Bob”的文檔。
  • 結果:返回_id爲1、3、4的文檔。

四、邏輯運算符(AND、OR、NOT)

當需要組合多個條件時,MongoDB提供了邏輯運算符$and$or$not

示例6:查詢年齡大於25且城市爲“China”的用戶(AND條件)

db.users.find({ 
  age: { $gt: 25 }, 
  "address.country": "China" 
})
  • 解釋:多個條件直接寫在查詢文檔中,MongoDB默認是AND關係,即同時滿足“年齡>25”和“國家是China”。
  • 結果:返回_id爲2(Bob,30歲,中國)、4(David,35歲,中國)的文檔。

示例7:查詢年齡25歲或城市爲“Beijing”的用戶(OR條件)

db.users.find({ 
  $or: [
    { age: 25 }, 
    { "address.city": "Beijing" }
  ] 
})
  • 解釋$or需要將條件放在數組中,每個元素是一個條件對象,滿足任意一個條件即可。
  • 結果:返回_id爲1(Alice,25歲)、1(Beijing)的文檔。

示例8:查詢年齡不大於30且愛好不含“gaming”的用戶(NOT條件)

db.users.find({ 
  age: { $not: { $gt: 30 } }, // 年齡≤30
  hobbies: { $ne: "gaming" }  // 愛好不等於gaming
})
  • 解釋$not用於否定條件,這裏否定$gt:30(即年齡≤30),同時排除愛好含“gaming”的用戶。
  • 結果:返回_id爲1(Alice,25歲,愛好不含gaming)、3(Charlie,22歲,愛好不含gaming)的文檔。

五、數組查詢(處理數組字段)

如果文檔包含數組類型(如hobbies),MongoDB支持數組相關的條件查詢,常見場景包括:
- 數組包含某個元素
- 數組長度等於指定值
- 數組中元素滿足特定條件

示例9:查詢愛好包含“reading”的用戶

db.users.find({ hobbies: "reading" })
  • 解釋:直接寫數組元素作爲條件,MongoDB默認會匹配數組中包含該元素的文檔(相當於$in操作)。
  • 結果:返回_id爲1(Alice,愛好含reading)的文檔。

示例10:查詢愛好包含“reading”或“travel”的用戶

db.users.find({ hobbies: { $in: ["reading", "travel"] } })
  • 解釋$in用於指定一個值列表,只要數組包含列表中的任意一個元素即可匹配。
  • 結果:返回_id爲1(Alice,含reading)、4(David,含travel)的文檔。

示例11:查詢愛好數組長度爲2的用戶

db.users.find({ hobbies: { $size: 2 } })
  • 解釋$size用於指定數組長度,這裏表示數組元素個數爲2。
  • 結果:返回_id爲1(Alice,2個愛好)、2(Bob,2個愛好)的文檔。

六、字符串匹配查詢(正則表達式)

使用$regex可以對字符串進行模糊匹配,支持正則表達式語法。

示例12:查詢姓名以“A”開頭的用戶

db.users.find({ name: { $regex: /^A/ } })
  • 解釋/^A/是正則表達式,表示“以A開頭”,$regex用於指定匹配規則。
  • 結果:返回_id爲1(Alice)的文檔。

示例13:查詢姓名包含“li”且不區分大小寫的用戶

db.users.find({ name: { $regex: /li/i } })
  • 解釋/li/i中的i表示不區分大小寫,li表示匹配包含“li”的字符串。
  • 結果:若有姓名爲“Alex”或“Li”的用戶會被匹配,此處示例數據中無符合條件的用戶。

七、總結

MongoDB條件查詢通過組合不同的條件運算符和邏輯運算符,可以實現從簡單到複雜的篩選需求。核心關鍵點:
1. 基礎查詢:直接通過字段名=值匹配(等於條件)。
2. 比較運算符$gt/$lt等處理範圍查詢。
3. 邏輯運算符$and(默認)、$or$not組合多條件。
4. 數組查詢$in$size等處理數組元素匹配。
5. 字符串匹配$regex支持正則表達式模糊查詢。

通過練習上述示例,你可以逐步掌握MongoDB條件查詢的核心邏輯,應對大部分數據篩選場景。

練習題

嘗試用以下條件查詢,驗證你的理解:
1. 查詢年齡小於30歲且城市爲“Guangzhou”的用戶。
2. 查詢愛好包含“coding”或“photography”的用戶。
3. 查詢姓名以“C”開頭且年齡爲偶數的用戶。

(答案可在MongoDB客戶端中執行對應查詢語句驗證)

小夜