" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MongoDB實(shí)現(xiàn)查詢、分頁和排序操作以及游標(biāo)的使用

 更新時間:2022年07月08日 15:35:49   作者:奮斗的大橙子  
本文詳細(xì)講解了MongoDB實(shí)現(xiàn)查詢、分頁和排序操作以及游標(biāo)的使用方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、Find查詢

事前準(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 ({條件},{鍵指定})

查詢出所有數(shù)據(jù)的指定鍵(name ,age ,country)

db.Students.find({},{name:1,age:1,country:1,_id:0})
  • ※條件不寫就是查詢?nèi)?/li>
  • ※需要查詢的就在鍵后指定為1,不用就指定為0(感覺只要想查的鍵后面有值不見得非得是1)
  • ※如果不指定顯示=式_id:0,那查詢過程都是帶有_id的

2.查詢條件

比較操作符

意義

舉例

$lt

<

查詢出id小于5的學(xué)生

> db.Students.find({_id:{$lt:5}},{})

$lte

<=

查詢出年齡小于等于25歲之間的學(xué)生

> db.Students.find({age:{$lte:25}},{})

$ne

!=

查詢出國家不是中國的學(xué)生

> db.Students.find({country:{$ne:"China"}},{})

$gt

>

查詢所有年紀(jì)大于27歲的,中國學(xué)生名字

> db.Students.find({age:{$gt:27}},{name:1,country:1,age:1})

{ "_id" : 5, "name" : "Zhou", "age" : 30, "country" : "China" }

$gte

>=

同上

3.包含或不包含

較操作符

意義

舉例

$in

包含

查詢國家是中國和美國的學(xué)生

> db.Students.find({country:{$in:["China","USA"]}},{})

$nin

不包含

查詢年齡不是27歲的學(xué)生

> db.Students.find({age:{$nin:[27]}},{})

4.OR查詢

較操作符

意義

舉例

$or

包含

查詢年齡小于27歲,或者國家是美國的學(xué)生

>db.Students.find({$or:[{age:{$lt:27}},{country:"USA"}]},{})

查詢年齡大于等于30歲,或者國家是不是美國的學(xué)生

>db.Students.find({$or:[{age:{$gte:30}},{country:{$nin:["China"]}}]},{})

5.Null

為所有美國學(xué)生添加性別屬性為男性(M)

> db.Students.update({country:"USA"},{$set:{sex:"M"}},false,true)

查詢所有sex屬性為null的學(xué)生

> db.Students.find({sex:{$in:[null]}},{name:1,country:1})

6.正則查詢

查詢出名字中存在”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ù)組查詢$all和index應(yīng)用

查詢所有擁有JS和PHP書籍的同學(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" ] }

查詢第三本書是C#的同學(xué)

> db.Students.find({"books.2":"C#"},{})
{ "_id" : 3, "name" : "Sun", "age" : 26, "country" : "USA", "books" : [ "JS", "JAVA", "C#", "MONGODB" ], "sex" : "M" } 

上面那個使用index來查詢的例子中,"books.2"一定要用""包含起來

9.查詢指定長度數(shù)組$size

它不能與比較查詢符一起使用(這是弊端)

插入一條book數(shù)組有兩本數(shù)的同學(xué)

> db.Students.insert({_id:9,name:"Xu",age:26,country:"Japan",books:["C#","PHP"]})
WriteResult({ "nInserted" : 1 })

查詢只有兩本書的同學(xué)

> db.Students.find({books:{$size:2}},{})
{ "_id" : 9, "name" : "Xu", "age" : 26, "country" : "Japan", "books" : [ "C#", "PHP" ] }

查詢名字是“Li”的喜歡的書的數(shù)量

> var person = db.Students.find({name:"Li"})
> while(person.hasNext()){ obj = person.next(); print(obj.books.length) }

10.$slice操作符返回文檔中指定數(shù)組的內(nèi)部值

查詢名字為“Wang”書架中第1~3本書

> db.Students.find({name:"Wang"},{books:{$slice:[0,3]}})
{ "_id" : 8, "name" : "Wang", "age" : 26, "country" : "Korea", "books" : [ "JS", "C#", "EXTJS" ] }

查詢出最后一本書

> db.Students.find({name:"Wang"},{books:{$slice:-1}})
{ "_id" : 8, "name" : "Wang", "age" : 26, "country" : "Korea", "books" : [ "MONGODB" ] } 

11.文檔查詢

添加一個對象數(shù)組到“Li”同學(xué),記錄“Li”同學(xué)的成績

> 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 }]
}
 
>

查詢參加了數(shù)學(xué)考試,并且分?jǐn)?shù)為90的同學(xué)

①.絕對匹配可以

> db.Students.find({school:{subject:"Math",score:90}},{_id:0,name:1})
{ "name" : "Li" }  

但是問題存在如下:

條件順序變化時候,

> db.Students.find({school:{score:90,subject:"Math"}},{_id:0,name:1})
> --查不到東西--

條件數(shù)目不一致的時候,也同樣查不到

②.為了解決順序的問題我可以用對象“.”

> db.Students.find({"school.subject":"Math","school.score":90},{name:1})
{ "_id" : 4, "name" : "Li" }

這種方式支持順序的變化,但是也同樣存在問題,那就是匹配的問題,條件不是作為一對條件來進(jìn)行匹配的

例如:

> db.Students.find({"school.subject":"Math","school.score":85},{name:1})
{ "_id" : 4, "name" : "Li" } 

這里的85分是英語成績

③.正確做法單條條件組查詢$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" }
>

二、分頁與排序

1.Limit返回指定的數(shù)據(jù)條數(shù)

查詢出Student文檔中前5條數(shù)據(jù)

> db.Students.find().limit(5)
 

2.Skip返回指定數(shù)據(jù)的跨度

查詢出persons文檔中3~8條的數(shù)據(jù)

> db.Students.find().limit(5).skip(2)

3.Sort返回按照年齡排序的數(shù)據(jù)[1,-1]

查詢所有數(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性能不好,可以采用插入時間的做法來彌補(bǔ),具體方法如下:

  • 1.在每一個記錄后面都加入一個插入時間的鍵值對
  • 2.每次取數(shù)據(jù)的時候都把取出的最后一個數(shù)據(jù)的時間保存下來,再傳給下一次查詢
  • 3.使用db.persons.find({date:{$gt:日期數(shù)值}}).limit(取出的數(shù)據(jù)數(shù)目)比較查詢?nèi)〕鲆猪摰臄?shù)據(jù)

三、游標(biāo)和其他知識

1.利用游標(biāo)來查詢數(shù)據(jù)

var  persons = db.persons.find();
while(persons.hasNext()){
obj = persons.next();
      print(obj.name)
 }

2.游標(biāo)幾個銷毀條件  

客戶端發(fā)來信息叫他銷毀

游標(biāo)迭代完畢

默認(rèn)游標(biāo)超過10分鐘沒用也會別清除

3.查詢快照

快照后就會針對不變的集合進(jìn)行游標(biāo)運(yùn)動了,看看使用方法.

db.persons.find({$query:{name:”Jim”},$snapshot:true})

為什么用快照,以為MongoDB在進(jìn)行更新的時候,例如添加一些鍵值對,那么MongoDB的處理不會在原來的索引位置上進(jìn)行更新操作,而是會把

更新之后的數(shù)據(jù),放在末尾,那么就導(dǎo)致了前后兩次進(jìn)行查詢時候相同索引對應(yīng)不同數(shù)據(jù)的情況

補(bǔ)充:

高級查詢選項(xiàng)

  • $where
  • $query
  • $orderby
  • $maxsan:integer 最多掃描的文檔數(shù)
  • $min:doc 查詢開始
  • $max:doc 查詢結(jié)束
  • $hint:doc 使用哪個索引
  • $explain:boolean 統(tǒng)計(jì)
  • $snapshot:boolean 一致快照

到此這篇關(guān)于MongoDB實(shí)現(xiàn)查詢操作的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MongoDB學(xué)習(xí)以及集群搭建的實(shí)踐全紀(jì)錄

    MongoDB學(xué)習(xí)以及集群搭建的實(shí)踐全紀(jì)錄

    這篇文章主要給大家介紹了關(guān)于MongoDB學(xué)習(xí)以及集群搭建的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • MongoDB運(yùn)行日志實(shí)現(xiàn)自動分割的方法實(shí)例

    MongoDB運(yùn)行日志實(shí)現(xiàn)自動分割的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于MongoDB運(yùn)行日志實(shí)現(xiàn)自動分割的方法,文中以一個MongoDB實(shí)例為例,寫了一個腳本來實(shí)現(xiàn)自動分割MongoDB日志,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • MongoDB數(shù)據(jù)庫基礎(chǔ)知識整理

    MongoDB數(shù)據(jù)庫基礎(chǔ)知識整理

    這篇文章介紹了MongoDB數(shù)據(jù)庫的基礎(chǔ)知識,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Spring Boot中使用MongoDB數(shù)據(jù)庫的方法

    Spring Boot中使用MongoDB數(shù)據(jù)庫的方法

    MongoDB是一個高性能,開源,無模式的,基于分布式文件存儲的文檔型數(shù)據(jù)庫,由C++語言編寫,其名稱來源取自“humongous”,是一種開源的文檔數(shù)據(jù)庫──NoSql數(shù)據(jù)庫的一種。這篇文章主要介紹了Spring Boot中使用MongoDB數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2017-12-12
  • mongodb索引知識_動力節(jié)點(diǎn)Java學(xué)院整理

    mongodb索引知識_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章給大家介紹了mongodb索引的建立,刪除索引的方法以及唯一索引和組合索引的知識,感興趣的朋友一起看看吧
    2017-08-08
  • Linux安裝MongoDB?4.0.3詳細(xì)步驟

    Linux安裝MongoDB?4.0.3詳細(xì)步驟

    這篇文章主要介紹了Linux安裝MongoDB?4.0.3詳細(xì)步驟的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • MongoDB的下載、安裝與部署方法

    MongoDB的下載、安裝與部署方法

    這篇文章主要介紹了MongoDB的下載、安裝與部署方法,需要的朋友可以參考下
    2017-05-05
  • Mongodb文檔和數(shù)組的通配符索引應(yīng)用小結(jié)

    Mongodb文檔和數(shù)組的通配符索引應(yīng)用小結(jié)

    Mongodb的通配符索引,為靈活可變的Mongodb數(shù)據(jù)結(jié)構(gòu)提供了高效的查詢方法,本文結(jié)合Mongodb官方文檔,詳細(xì)介紹在嵌入式文檔和數(shù)組上,通配符索引的結(jié)構(gòu),感興趣的朋友一起看看吧
    2024-07-07
  • MongoDB 監(jiān)控工具mongostat和mongotop的使用

    MongoDB 監(jiān)控工具mongostat和mongotop的使用

    這篇文章主要介紹了MongoDB 監(jiān)控工具mongostat和mongotop的使用方法,幫助大家更好的理解和學(xué)習(xí)使用MongoDB,感興趣的朋友可以了解下
    2021-03-03
  • MongoDB的創(chuàng)建、更新和刪除

    MongoDB的創(chuàng)建、更新和刪除

    下面開始學(xué)習(xí)MongoDB最重要也是最基礎(chǔ)的部分:C(創(chuàng)建)R(查詢)U(更新)D(刪除);由于R(查詢)操作相對來說內(nèi)容比較多,也比較繁瑣,同時使用頻率也比較高,所以下一篇會拿出來單獨(dú)介紹。廢話不多說,連上服務(wù)器,我們直接進(jìn)入正題
    2017-05-05

最新評論

砀山县| 彭泽县| 镇沅| 洪洞县| 谷城县| 温泉县| 应城市| 西吉县| 辉南县| 哈尔滨市| 湘潭市| 大名县| 双鸭山市| 宣威市| 梁河县| 中西区| 长岭县| 阜城县| 呼和浩特市| 夏津县| 定日县| 旬阳县| 乃东县| 民勤县| 岳普湖县| 博客| 平泉县| 玉树县| 阿合奇县| 平江县| 龙泉市| 洪洞县| 礼泉县| 河源市| 安达市| 读书| 巴东县| 昔阳县| 林芝县| 平湖市| 靖边县|