查詢選擇器
<b>最簡(jiǎn)單的查詢語(yǔ)句:</b>
db.customers.find();
這種查詢語(yǔ)句會(huì)按照插入的順序返回前20個(gè)文檔苛吱。如果需要顯示更多的話吹泡,只需按下"lt"命令就可以顯示更多的文檔了骤星。
<b>精確匹配選擇器:</b>
db.customers.find({id:6});
db.customers.find({id:6,name:"name 1",age:101});
根據(jù)指定的字段查詢文檔,這種查詢方式稱為精確匹配選擇器爆哑。
<b>$lt表示的是小于:</b>
db.customers.find({id:{$lt:10}});
<b>$lte表示的是小于或者等于:</b>
db.customers.find({id:{$lte:6});
<b>$gt表示的是大于:</b>
db.customers.find({id:{$gt:1});
<b>$gte表示的是大于或等于:</b>
db.customers.find({id:{$gte:3}});
<b>范圍選擇器:</b>
db.customers.find({age:{$lt:120,$gte:112});
該查詢語(yǔ)句表示小于120,大于或等于112洞难。
db.customers.find({id:{$in:[1,2]}});
$in表示返回的key的值在某些value范圍內(nèi)。
db.customers.find({id:{$nin:[1,2]}});
$nin表示返回的key的值不在某些范圍之內(nèi),這種查詢效率非常低揭朝,因?yàn)樗鼤?huì)對(duì)全表進(jìn)行掃描操作队贱。
db.customers.find({id:{$ne:1}});
$ne表示的是不等于。單獨(dú)使用$ne它也不會(huì)使用索引的優(yōu)勢(shì)潭袱,反而會(huì)進(jìn)行全表掃描柱嫌,我們最好與其它選擇器配合使用,以便發(fā)揮最大的查詢性能屯换。
db.customers.find({$or:[{id:2},{id:3}]});
$or表示或運(yùn)算的選擇器,主要用于對(duì)兩個(gè)不同的key對(duì)應(yīng)的文檔進(jìn)行連接编丘。
db.customers.find({$and:[{id:2},{age:111}]});
$and表示與預(yù)算的選擇器,主要用于對(duì)兩個(gè)不同的key要同時(shí)滿足條件。
db.customers.find({$exists:false});
$exists與關(guān)系數(shù)據(jù)庫(kù)中的exists不一樣彤悔,因?yàn)镸ongoDB的表結(jié)構(gòu)不固定嘉抓,有時(shí)候需要返回包含某個(gè)字段的所有記錄或者不包含某個(gè)字段的所有記錄,$exists這時(shí)就可以派上用場(chǎng)了晕窑。當(dāng)然你還可以使用備用查詢操作方法:db.customers.find({id:null});
查詢投射
在我們進(jìn)行查詢的時(shí)候抑片,有時(shí)我們需要對(duì)返回的結(jié)果集進(jìn)行進(jìn)一步的處理,如只需要返回指定的字段杨赤,此時(shí)查詢投射項(xiàng)就可以發(fā)揮它的功效了敞斋,下面我們逐一剖析。
db.customers.find({'detail.1.post':5},{_id:0,id:1,name:1});
此條語(yǔ)句執(zhí)行的結(jié)果就是按照條件'detail.1.post':5來(lái)返回結(jié)果集疾牲,但是只顯示id和name兩個(gè)字段哦植捎,同時(shí)過濾默認(rèn)生成字段_id。
db.customers.find().sort({id:-1});
對(duì)查詢的結(jié)果集按照id的降序進(jìn)行排序后返回说敏。(ps:建立索引能提高查詢速度)鸥跟。
db.customers.find({}).skip(5).limit(5).sort({id:-1});
此條語(yǔ)句執(zhí)行的過程是先對(duì)結(jié)果集進(jìn)行排序丢郊,然后跳過5行盔沫,然后從這個(gè)位置返回接下的5行医咨。(ps:如果skip的參數(shù)過大,那么查詢語(yǔ)句將會(huì)掃描大量的文檔架诞,這樣執(zhí)行性能將會(huì)很低下拟淮。因此查詢盡量不要用skip,用其它方式來(lái)代替skip的操作)谴忧。
數(shù)組操作
db.customers.find({'detail.1.post':5},{_id:0,id:1,name:1});
投射選項(xiàng){_id:0,name:1}針對(duì)的值是簡(jiǎn)單類型很泊,包括查詢選擇器也是嵌套文檔,可以通過操作符"."一點(diǎn)點(diǎn)嵌套進(jìn)去沾谓,如果值為數(shù)組類型并且數(shù)組的元素又是文檔類型委造,查詢語(yǔ)句將會(huì)有所改變。
假如有如下結(jié)構(gòu)數(shù)據(jù):
{
"_id":1,
"name":"車",
"brand":"大眾","寶馬","奔馳","別克","東風(fēng)悅達(dá)起亞"
}
1.精確匹配數(shù)組值
我們可以通過簡(jiǎn)單的精確匹配得到某條記錄均驶,如以下語(yǔ)句所示昏兆。
db.cars.find({"brand":["大眾","寶馬","奔馳"]});
2.匹配數(shù)組中的一個(gè)值
假如數(shù)組有多個(gè)元素,只要這些元素中包含有這個(gè)值妇穴,就會(huì)返回這條文檔爬虱,如下所示。
db.cars.find({"brand":"大眾"});
假如此時(shí)集合中有兩條記錄,則返回值中兩條記錄都會(huì)存在腾它。
3.配置指定位置的元素值
db.cars.find({"brand.0":"大眾"});
4.指定數(shù)組索引并匹配嵌套文檔中的字段值
{
"_id":1,
"StatusInfo":[
{
"status":9,
"desc":"已取消"
},
{
"status":2,
"desc":"已付款"
}
]
}
字段"StatusInfo"是一個(gè)嵌套文檔的數(shù)組跑筝。
db.Order.find({"StatusInfo.0.status":2});
返回?cái)?shù)組中索引0處且嵌套文檔中status值為2的所有文檔。
總結(jié)
通過學(xué)習(xí)MongoDB的查詢操作符瞒滴,我們可以根據(jù)自己的業(yè)務(wù)來(lái)查詢自己所要查詢的內(nèi)容曲梗,但是在建立查詢的時(shí)候千萬(wàn)不要忘記文中所提及的ps哦,加入索引能提高查詢速度妓忍,這是一種以空間換時(shí)間的方法稀并,所以要掌握MongoDB的查詢操作就是在實(shí)際中不斷去積累。