MongoDB實(shí)現(xiàn)查詢(xún)、分頁(yè)和排序操作以及游標(biāo)的使用
一、Find查詢(xún)
事前準(zhǔn)備:插入如下數(shù)據(jù)
db.Students.insert([ { _id:1, name:"Zhao", age:25, country:"USA", books:["JS","C++","EXTJS","MONGODB"]}, { _id:2, name:"Qian",age:22, country:"USA", books:["PHP","JAVA","EXTJS","C++"]}, { _id:3,name:"Sun",age:26, country:"USA", books:["JS","JAVA","C#","MONGODB"]}, { _id:4, name:"Li",age:27,country:"China",books:["JS","JAVA","EXTJS","MONGODB"]}, { _id:5,name:"Zhou", age:30,country:"China",books:["JS","C#","PHP","MONGODB"]}, { _id:6, name:"Wu", age:27, country:"Japan", books:["JS","JAVA","C++","MONGODB"]}, { _id:7, name:"Zheng", age:27, country:"UK", books:["JS","JAVA","EXTJS","PHP"]}, { _id:8, name:"Wang", age:26, country:"Korea",books:["JS","C#","EXTJS","MONGODB"]} ])
1.指定返回的鍵
db.[文檔名].find ({條件},{鍵指定})
查詢(xún)出所有數(shù)據(jù)的指定鍵(name ,age ,country)
db.Students.find({},{name:1,age:1,country:1,_id:0})
- ※條件不寫(xiě)就是查詢(xún)?nèi)?/li>
- ※需要查詢(xún)的就在鍵后指定為1,不用就指定為0(感覺(jué)只要想查的鍵后面有值不見(jiàn)得非得是1)
- ※如果不指定顯示=式_id:0,那查詢(xún)過(guò)程都是帶有_id的
2.查詢(xún)條件
比較操作符 | 意義 | 舉例 |
---|---|---|
$lt | < | 查詢(xún)出id小于5的學(xué)生 >db.Students.find({_id:{$lt:5}},{}) |
$lte | <= | 查詢(xún)出年齡小于等于25歲之間的學(xué)生 > db.Students.find({age:{$lte:25}},{}) |
$ne | != | 查詢(xún)出國(guó)家不是中國(guó)的學(xué)生 > db.Students.find({country:{$ne:"China"}},{}) |
$gt | > | 查詢(xún)所有年紀(jì)大于27歲的,中國(guó)學(xué)生名字 > db.Students.find({age:{$gt:27}},{name:1,country:1,age:1}) { "_id" : 5, "name" : "Zhou", "age" : 30, "country" : "China" } |
$gte | >= | 同上 |
3.包含或不包含
較操作符 | 意義 | 舉例 |
---|---|---|
$in | 包含 | 查詢(xún)國(guó)家是中國(guó)和美國(guó)的學(xué)生 > db.Students.find({country:{$in:["China","USA"]}},{}) |
$nin | 不包含 | 查詢(xún)年齡不是27歲的學(xué)生 > db.Students.find({age:{$nin:[27]}},{}) |
4.OR查詢(xún)
較操作符 | 意義 | 舉例 |
---|---|---|
$or | 包含 | 查詢(xún)年齡小于27歲,或者國(guó)家是美國(guó)的學(xué)生 >db.Students.find({$or:[{age:{$lt:27}},{country:"USA"}]},{}) 查詢(xún)年齡大于等于30歲,或者國(guó)家是不是美國(guó)的學(xué)生 >db.Students.find({$or:[{age:{$gte:30}},{country:{$nin:["China"]}}]},{}) |
5.Null
為所有美國(guó)學(xué)生添加性別屬性為男性(M)
> db.Students.update({country:"USA"},{$set:{sex:"M"}},false,true)
查詢(xún)所有sex屬性為null的學(xué)生
> db.Students.find({sex:{$in:[null]}},{name:1,country:1})
6.正則查詢(xún)
查詢(xún)出名字中存在”Zh”的學(xué)生的信息
> db.Students.find({name:/Zh/},{}) { "_id" : 1, "name" : "Zhao", "age" : 25, "country" : "USA", "books" : [ "JS", "C++", "EXTJS", "MONGODB" ], "sex" : "M" } { "_id" : 5, "name" : "Zhou", "age" : 30, "country" : "China", "books" : [ "JS", "C#", "PHP", "MONGODB" ] } { "_id" : 7, "name" : "Zheng", "age" : 27, "country" : "UK", "books" : [ "JS", "JAVA", "EXTJS", "PHP" ] }
7.$not的使用
※$not和$nin的區(qū)別是$not可以用在任何地方兒$nin是用到集合上的
查找出名字中不存在“Zh”的學(xué)生信息
> db.Students.find({name:{$not:/Zh/}},{}) { "_id" : 2, "name" : "Qian", "age" : 22, "country" : "USA", "books" : [ "PHP","JAVA", "EXTJS", "C++" ], "sex" : "M" } { "_id" : 3, "name" : "Sun", "age" : 26, "country" : "USA", "books" : [ "JS", "JAVA", "C#", "MONGODB" ], "sex" : "M" } { "_id" : 4, "name" : "Li", "age" : 27, "country" : "China", "books" : [ "JS", "JAVA", "EXTJS", "MONGODB" ] } { "_id" : 6, "name" : "Wu", "age" : 27, "country" : "Japan", "books" : [ "JS", "JAVA", "C++", "MONGODB" ] } { "_id" : 8, "name" : "Wang", "age" : 26, "country" : "Korea", "books" : [ "JS","C#", "EXTJS", "MONGODB" ] }
8.數(shù)組查詢(xún)$all和index應(yīng)用
查詢(xún)所有擁有JS和PHP書(shū)籍的同學(xué)
> db.Students.find({books:{$all:["JS","PHP"]}},{}) { "_id" : 5, "name" : "Zhou", "age" : 30, "country" : "China", "books" : [ "JS", "C#", "PHP", "MONGODB" ] } { "_id" : 7, "name" : "Zheng", "age" : 27, "country" : "UK", "books" : [ "JS", "JAVA", "EXTJS", "PHP" ] }
查詢(xún)第三本書(shū)是C#的同學(xué)
> db.Students.find({"books.2":"C#"},{}) { "_id" : 3, "name" : "Sun", "age" : 26, "country" : "USA", "books" : [ "JS", "JAVA", "C#", "MONGODB" ], "sex" : "M" }
上面那個(gè)使用index來(lái)查詢(xún)的例子中,"books.2"一定要用""包含起來(lái)
9.查詢(xún)指定長(zhǎng)度數(shù)組$size
它不能與比較查詢(xún)符一起使用(這是弊端)
插入一條book數(shù)組有兩本數(shù)的同學(xué)
> db.Students.insert({_id:9,name:"Xu",age:26,country:"Japan",books:["C#","PHP"]}) WriteResult({ "nInserted" : 1 })
查詢(xún)只有兩本書(shū)的同學(xué)
> db.Students.find({books:{$size:2}},{}) { "_id" : 9, "name" : "Xu", "age" : 26, "country" : "Japan", "books" : [ "C#", "PHP" ] }
查詢(xún)名字是“Li”的喜歡的書(shū)的數(shù)量
> var person = db.Students.find({name:"Li"}) > while(person.hasNext()){ obj = person.next(); print(obj.books.length) }
10.$slice操作符返回文檔中指定數(shù)組的內(nèi)部值
查詢(xún)名字為“Wang”書(shū)架中第1~3本書(shū)
> db.Students.find({name:"Wang"},{books:{$slice:[0,3]}}) { "_id" : 8, "name" : "Wang", "age" : 26, "country" : "Korea", "books" : [ "JS", "C#", "EXTJS" ] }
查詢(xún)出最后一本書(shū)
> db.Students.find({name:"Wang"},{books:{$slice:-1}}) { "_id" : 8, "name" : "Wang", "age" : 26, "country" : "Korea", "books" : [ "MONGODB" ] }
11.文檔查詢(xún)
添加一個(gè)對(duì)象數(shù)組到“Li”同學(xué),記錄“Li”同學(xué)的成績(jī)
> var li = [{ ... subject :"Math", ... score: 90 ... },{ ... subject :"English", ... score:85 ... },{ ... subject :"History", ... score:95 ... }] > db.Students.update({name:"Li"},{$set:{school:li}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.Students.find({name:"Li"},{}) { "_id" : 4, "name" : "Li", "age" : 27, "country" : "China", "books" : [ "JS", "JAVA", "EXTJS", "MONGODB" ], "school" : [{ "subject" : "Math", "score" : 90 },{ "subject" : "English", "score" : 85 }, { "subject" : "History", "score" : 95 }] } >
查詢(xún)參加了數(shù)學(xué)考試,并且分?jǐn)?shù)為90的同學(xué)
①.絕對(duì)匹配可以
> db.Students.find({school:{subject:"Math",score:90}},{_id:0,name:1}) { "name" : "Li" }
但是問(wèn)題存在如下:
條件順序變化時(shí)候,
> db.Students.find({school:{score:90,subject:"Math"}},{_id:0,name:1}) > --查不到東西--
條件數(shù)目不一致的時(shí)候,也同樣查不到
②.為了解決順序的問(wèn)題我可以用對(duì)象“.”
> db.Students.find({"school.subject":"Math","school.score":90},{name:1}) { "_id" : 4, "name" : "Li" }
這種方式支持順序的變化,但是也同樣存在問(wèn)題,那就是匹配的問(wèn)題,條件不是作為一對(duì)條件來(lái)進(jìn)行匹配的
例如:
> db.Students.find({"school.subject":"Math","school.score":85},{name:1}) { "_id" : 4, "name" : "Li" }
這里的85分是英語(yǔ)成績(jī)
③.正確做法單條條件組查詢(xún)$elemMatch
> db.Students.find({school:{$elemMatch:{subject:"Math",score:90}}},{name:1}) { "_id" : 4, "name" : "Li" } > db.Students.find({school:{$elemMatch:{score:90,subject:"Math"}}},{name:1}) { "_id" : 4, "name" : "Li" } > db.Students.find({school:{$elemMatch:{subject:"Math"}}},{name:1}) { "_id" : 4, "name" : "Li" } >
二、分頁(yè)與排序
1.Limit返回指定的數(shù)據(jù)條數(shù)
查詢(xún)出Student文檔中前5條數(shù)據(jù)
> db.Students.find().limit(5)
2.Skip返回指定數(shù)據(jù)的跨度
查詢(xún)出persons文檔中3~8條的數(shù)據(jù)
> db.Students.find().limit(5).skip(2)
3.Sort返回按照年齡排序的數(shù)據(jù)[1,-1]
查詢(xún)所有數(shù)據(jù),按照年齡排序
正序
> db.Students.find({},{_id:0,age:1,name:1}).sort({age:1}) { "name" : "Qian", "age" : 22 } { "name" : "Zhao", "age" : 25 } { "name" : "Sun", "age" : 26 } { "name" : "Wang", "age" : 26 } { "name" : "Xu", "age" : 26 } { "name" : "Wu", "age" : 27 } { "name" : "Zheng", "age" : 27 } { "name" : "Li", "age" : 27 } { "name" : "Zhou", "age" : 30 }
倒序
> db.Students.find({},{_id:0,age:1,name:1}).sort({age:-1}) { "name" : "Zhou", "age" : 30 } { "name" : "Wu", "age" : 27 } { "name" : "Zheng", "age" : 27 } { "name" : "Li", "age" : 27 } { "name" : "Sun", "age" : 26 } { "name" : "Wang", "age" : 26 } { "name" : "Xu", "age" : 26 } { "name" : "Zhao", "age" : 25 } { "name" : "Qian", "age" : 22 } >
skip性能不好,可以采用插入時(shí)間的做法來(lái)彌補(bǔ),具體方法如下:
- 1.在每一個(gè)記錄后面都加入一個(gè)插入時(shí)間的鍵值對(duì)
- 2.每次取數(shù)據(jù)的時(shí)候都把取出的最后一個(gè)數(shù)據(jù)的時(shí)間保存下來(lái),再傳給下一次查詢(xún)
- 3.使用db.persons.find({date:{$gt:日期數(shù)值}}).limit(取出的數(shù)據(jù)數(shù)目)比較查詢(xún)?nèi)〕鲆猪?yè)的數(shù)據(jù)
三、游標(biāo)和其他知識(shí)
1.利用游標(biāo)來(lái)查詢(xún)數(shù)據(jù)
var persons = db.persons.find(); while(persons.hasNext()){ obj = persons.next(); print(obj.name) }
2.游標(biāo)幾個(gè)銷(xiāo)毀條件
客戶(hù)端發(fā)來(lái)信息叫他銷(xiāo)毀
游標(biāo)迭代完畢
默認(rèn)游標(biāo)超過(guò)10分鐘沒(méi)用也會(huì)別清除
3.查詢(xún)快照
快照后就會(huì)針對(duì)不變的集合進(jìn)行游標(biāo)運(yùn)動(dòng)了,看看使用方法.
db.persons.find({$query:{name:”Jim”},$snapshot:true})
為什么用快照,以為MongoDB在進(jìn)行更新的時(shí)候,例如添加一些鍵值對(duì),那么MongoDB的處理不會(huì)在原來(lái)的索引位置上進(jìn)行更新操作,而是會(huì)把
更新之后的數(shù)據(jù),放在末尾,那么就導(dǎo)致了前后兩次進(jìn)行查詢(xún)時(shí)候相同索引對(duì)應(yīng)不同數(shù)據(jù)的情況
補(bǔ)充:
高級(jí)查詢(xún)選項(xiàng)
- $where
- $query
- $orderby
- $maxsan:integer 最多掃描的文檔數(shù)
- $min:doc 查詢(xún)開(kāi)始
- $max:doc 查詢(xún)結(jié)束
- $hint:doc 使用哪個(gè)索引
- $explain:boolean 統(tǒng)計(jì)
- $snapshot:boolean 一致快照
到此這篇關(guān)于MongoDB實(shí)現(xiàn)查詢(xún)操作的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。