網站首頁 編程語言 正文
一、Find查詢
事前準備:插入如下數據
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 ({條件},{鍵指定})
查詢出所有數據的指定鍵(name ,age ,country)
db.Students.find({},{name:1,age:1,country:1,_id:0})
- ※條件不寫就是查詢全部
- ※需要查詢的就在鍵后指定為1,不用就指定為0(感覺只要想查的鍵后面有值不見得非得是1)
- ※如果不指定顯示=式_id:0,那查詢過程都是帶有_id的
2.查詢條件
比較操作符 |
意義 |
舉例 |
---|---|---|
$lt |
< |
查詢出id小于5的學生 >?db.Students.find({_id:{$lt:5}},{}) |
$lte |
<= |
查詢出年齡小于等于25歲之間的學生 > db.Students.find({age:{$lte:25}},{}) |
$ne |
!= |
查詢出國家不是中國的學生 > db.Students.find({country:{$ne:"China"}},{}) |
$gt |
> |
查詢所有年紀大于27歲的,中國學生名字 > db.Students.find({age:{$gt:27}},{name:1,country:1,age:1}) { "_id" : 5, "name" : "Zhou", "age" : 30, "country" : "China" } |
$gte |
>= |
同上 |
3.包含或不包含
較操作符 |
意義 |
舉例 |
---|---|---|
$in |
包含 |
查詢國家是中國和美國的學生 > db.Students.find({country:{$in:["China","USA"]}},{}) |
$nin |
不包含 |
查詢年齡不是27歲的學生 > db.Students.find({age:{$nin:[27]}},{}) |
4.OR查詢
較操作符 |
意義 |
舉例 |
---|---|---|
$or |
包含 |
查詢年齡小于27歲,或者國家是美國的學生 >db.Students.find({$or:[{age:{$lt:27}},{country:"USA"}]},{}) 查詢年齡大于等于30歲,或者國家是不是美國的學生 >db.Students.find({$or:[{age:{$gte:30}},{country:{$nin:["China"]}}]},{}) |
5.Null
為所有美國學生添加性別屬性為男性(M)
> db.Students.update({country:"USA"},{$set:{sex:"M"}},false,true)
查詢所有sex屬性為null的學生
> db.Students.find({sex:{$in:[null]}},{name:1,country:1})
6.正則查詢
查詢出名字中存在”Zh”的學生的信息
> 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的區別是$not可以用在任何地方兒$nin是用到集合上的
查找出名字中不存在“Zh”的學生信息
> 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.數組查詢$all和index應用
查詢所有擁有JS和PHP書籍的同學
> 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#的同學
> 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.查詢指定長度數組$size
它不能與比較查詢符一起使用(這是弊端)
插入一條book數組有兩本數的同學
> db.Students.insert({_id:9,name:"Xu",age:26,country:"Japan",books:["C#","PHP"]}) WriteResult({ "nInserted" : 1 })
查詢只有兩本書的同學
> db.Students.find({books:{$size:2}},{}) { "_id" : 9, "name" : "Xu", "age" : 26, "country" : "Japan", "books" : [ "C#", "PHP" ] }
查詢名字是“Li”的喜歡的書的數量
> var person = db.Students.find({name:"Li"}) > while(person.hasNext()){ obj = person.next(); print(obj.books.length) }
10.$slice操作符返回文檔中指定數組的內部值
查詢名字為“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.文檔查詢
添加一個對象數組到“Li”同學,記錄“Li”同學的成績
> 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 }] } >
查詢參加了數學考試,并且分數為90的同學
①.絕對匹配可以
> 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}) > --查不到東西--
條件數目不一致的時候,也同樣查不到
②.為了解決順序的問題我可以用對象“.”
> db.Students.find({"school.subject":"Math","school.score":90},{name:1}) { "_id" : 4, "name" : "Li" }
這種方式支持順序的變化,但是也同樣存在問題,那就是匹配的問題,條件不是作為一對條件來進行匹配的
例如:
> 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返回指定的數據條數
查詢出Student文檔中前5條數據
> db.Students.find().limit(5)
?
2.Skip返回指定數據的跨度
查詢出persons文檔中3~8條的數據
> db.Students.find().limit(5).skip(2)
3.Sort返回按照年齡排序的數據[1,-1]
查詢所有數據,按照年齡排序
正序
> 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性能不好,可以采用插入時間的做法來彌補,具體方法如下:
- 1.在每一個記錄后面都加入一個插入時間的鍵值對
- 2.每次取數據的時候都把取出的最后一個數據的時間保存下來,再傳給下一次查詢
- 3.使用db.persons.find({date:{$gt:日期數值}}).limit(取出的數據數目)比較查詢取出要分頁的數據
三、游標和其他知識
1.利用游標來查詢數據
var persons = db.persons.find(); while(persons.hasNext()){ obj = persons.next(); print(obj.name) }
2.游標幾個銷毀條件
客戶端發來信息叫他銷毀
游標迭代完畢
默認游標超過10分鐘沒用也會別清除
3.查詢快照
快照后就會針對不變的集合進行游標運動了,看看使用方法.
db.persons.find({$query:{name:”Jim”},$snapshot:true})
為什么用快照,以為MongoDB在進行更新的時候,例如添加一些鍵值對,那么MongoDB的處理不會在原來的索引位置上進行更新操作,而是會把
更新之后的數據,放在末尾,那么就導致了前后兩次進行查詢時候相同索引對應不同數據的情況
補充:
高級查詢選項
- $where
- $query
- $orderby
- $maxsan:integer 最多掃描的文檔數
- $min:doc 查詢開始
- $max:doc 查詢結束
- $hint:doc 使用哪個索引
- $explain:boolean 統計
- $snapshot:boolean 一致快照
原文鏈接:https://www.cnblogs.com/dcz2015/p/5251309.html
相關推薦
- 2022-04-17 瀏覽器無法復制文字解決辦法
- 2022-09-26 android Recycleview的側滑點擊刪除功能實現
- 2023-12-15 Linux系統設置多個IP地址、默認路由、指定路由、永久刪除默認路由
- 2022-07-10 table列表中輸入框input與文本span切換的實現
- 2022-03-15 巧用Redis實現分布式鎖詳細介紹_Redis
- 2022-12-05 Django中QuerySet查詢優化之prefetch_related詳解_python
- 2022-03-31 C#值類型、引用類型、泛型、集合、調用函數的表達式樹實踐_C#教程
- 2023-06-18 C#Process的OutputDataReceived事件不觸發問題及解決_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支