在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客戶端中執行對應查詢語句驗證)