<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
查詢就是返回集合中檔案的一個子集,子集的範圍從0個檔案到整個集合。要返回哪些檔案由find的第一個引數決定,該引數是一個用於指定查詢條件的檔案。
如果是空,則返回全部檔案。
當向查詢檔案中新增鍵值對時,就意味著限定了查詢條件。例如db.users.find({"name":"哪吒程式設計"})
可以在查詢檔案時,傳入多個鍵值對,相當於關係型資料庫中的where ... and ...
。
有時候,只想查詢檔案中的部分鍵
> db.users.find({},{"id":1,"dept":1}) { "_id" : ObjectId("638b2822bb535f1c23f9b09a"), "id" : "1", "dept" : [ { "name" : "哪吒程式設計", "age" : 18, "address" : "大連" }, { "name" : "雲韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] } { "_id" : ObjectId("638b3944bb535f1c23f9b09b"), "id" : "1", "dept" : [ { "name" : "哪吒程式設計", "age" : 18, "address" : "大連" }, { "name" : "雲韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] } > db.users.find({},{"_id":0,"dept":1}) { "dept" : [ { "name" : "哪吒程式設計", "age" : 18, "address" : "大連" }, { "name" : "雲韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] } { "dept" : [ { "name" : "哪吒程式設計", "age" : 18, "address" : "大連" }, { "name" : "雲韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }
$lt、$lte、$gt、$gte
都屬於比較運運算元,分別對應<、<=、>、>=
。
可以將其組合使用以查詢一個範圍內的值。
> db.users.find({"dept.age":{"$gte":20,"$lte":30}})
MongoDB中有兩種方式可以進行or查詢。$in
可以用來查詢一個鍵的多個值。$or
則更通用一些,可以在多個鍵中查詢任意的給定值。
> db.users.find({"id":{"$in":["1","3"]}}) { "_id" : ObjectId("638b2822bb535f1c23f9b09a"), "id" : "1", "dept" : [ { "name" : "哪吒程式設計", "age" : 18, "address" : "大連" }, { "name" : "雲韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] } { "_id" : ObjectId("638b3944bb535f1c23f9b09b"), "id" : "1", "dept" : [ { "name" : "哪吒程式設計", "age" : 18, "address" : "大連" }, { "name" : "雲韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] } { "_id" : ObjectId("638b4cacbb535f1c23f9b09c"), "id" : "3", "dept" : [ { "name" : "哪吒程式設計", "age" : 18, "address" : "大連" }, { "name" : "雲韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] } >
$not
是一個元條件運運算元,可以用於任何其它條件之上。
null的行為有一些特別。它可以與自身匹配。
> db.users.find({"dept":null}) { "_id" : ObjectId("638b538682bdbdfa72665a11"), "id" : "1", "dept" : null }
"$regex"可以在查詢中為字串的模式匹配提供正規表示式功能。正規表示式對於靈活的字串匹配非常有用。
> db.users.find({"name":{"$regex":"哪吒"}})) { "_id" : ObjectId("638b549982bdbdfa72665a12"), "id" : "1", "name" : "哪吒程式設計", "age" : 18 } { "_id" : ObjectId("638b54cd82bdbdfa72665a15"), "id" : "1", "name" : "CSDN哪吒", "age" : 18 }
MongoDB會使用Perl相容的正規表示式(PRCE)庫來對正規表示式進行匹配。任何PCRE支援的正規表示式語法都能被MongoDB接受。
$all
可以通過多個元素匹配陣列。
> db.workers.find({name:{$all:["哪吒程式設計","雲韻"]}}) { "_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒程式設計", "雲韻" ] } { "_id" : ObjectId("638b59fc82bdbdfa72665a16"), "id" : "1", "name" : [ "哪吒程式設計", "雲韻", "美杜莎" ] } { "_id" : ObjectId("638b59fc82bdbdfa72665a17"), "id" : "2", "name" : [ "哪吒程式設計", "雲韻", "納蘭嫣然" ] }
如果想在陣列中查詢特定位置的元素,可以使用key.index
語法來指定下標:
> db.workers.find({"name.2":"美杜莎"}) { "_id" : ObjectId("638b59fc82bdbdfa72665a16"), "id" : "1", "name" : [ "哪吒程式設計", "雲韻", "美杜莎" ] }
通過$size
指定要查詢的陣列的大小:
> db.workers.find({"name":{"$size":2}}) { "_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒程式設計", "雲韻" ] }
先舉一個例子:
> db.student.find() { "_id" : ObjectId("638b6b8382bdbdfa72665a19"), "id" : "1", "name" : "哪吒程式設計", "age" : 18 } { "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "雲韻", "age" : 23 } { "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] } { "_id" : ObjectId("638b6b8582bdbdfa72665a1c"), "id" : "3", "name" : "蕭炎", "age" : 38 } > db.student.find({"age":{"$gt":20,"$lt":28}}) { "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "雲韻", "age" : 23 } { "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] }
和想象中的不太一樣啊,我的本意是查詢年齡在20~28之間的人,為什麼呢?
檔案中的標量(非陣列元素)必須與查詢條件中的每一條子句相匹配。如果使用db.student.find({"age":{"$gt":20,"$lt":28}})
進行查詢,那麼age必須介於20~28之間,然而,如果age是一個陣列,那麼當age鍵中的某一個元素與查詢條件的任意一條語句相匹配時,檔案也會被返回。(即15<28,29大於20),完美適配。
這樣就會使針對陣列的範圍查詢失去了作用。
此時,可以使用"$elemMatch"
強制MongoDB將這兩個子句與單個陣列元素進行比較。不過,"$elemMatch"
不會匹配非陣列元素。
-- 返回空 db.student.find({"age":{"$elemMatch":{"$gt":20,"$lt":28}}})
如果在查詢的欄位上有索引,那麼可以使用min和max將查詢條件遍歷的索引範圍限制為"$gt"
和"$lt"
的值。
db.student.find({"age":{"$gt":20,"$lt":28}}).min({"age":20}).max({"age":28})
現在,這條查詢語句只會遍歷值在20~28之間的索引。
資料庫會使用遊標返回find的執行結果。遊標的使用者端實現通常能夠在很大程度上對查詢的最終輸出進行控制。你可以限制結果的數量,跳過一些結果,按任意方向的任意鍵組合對結果進行排序,以及執行徐國其他功能強大的操作。
通過cursor.hasNext()
檢查是否還有其它結果,通過cursor.next()
用來對其進行獲取。
呼叫find()時,shell並不會立即查詢資料庫,而是等到真正開始請求結果時才傳送查詢,這樣可以在執行之前給查詢附加額外的選項。cursor物件的大多數方法會返回遊標本身,這樣就可以按照任意順序將選項連結起來了。
在使用db.users.find();
查詢時,實際上查詢並沒有真正執行,只是在構造查詢,執行cursor.hasNext()
,查詢才會發往伺服器端。shell會立刻獲取前100個結果或者前4MB的資料(兩者之中的較小者),這樣下次呼叫next或者hasNext時就不必再次連線伺服器去獲取結果了。在使用者端遍歷完第一組結果後,shell會再次連線資料庫,使用getMore請求更多的結果。getMore請求包含一個遊標的識別符號,它會向資料庫詢問是否還有更多的結果,如果有則返回下一批結果。這個過程會一直持續,直到遊標耗盡或者結果被全部返回。
在伺服器端,遊標會佔用記憶體和資源。一旦遊標遍歷完結果之後,或者使用者端傳送一條訊息要求終止,資料庫就可以釋放它正在使用的資源。
何時銷燬遊標:
最常用的查詢選項是限制返回結果的數量、略過一定數量的結果以及排序。所有這些選項必須在查詢被傳送到資料庫之前指定。
使用skip略過少量的檔案是可以的,但對於結果非常多的情況,skip會非常慢,因為要首先找到被略過的結果,然後再丟棄這些資料。
最簡單的分頁方式是
> db.student.find().sort({"id":1}).limit(5) { "_id" : ObjectId("638b6b8382bdbdfa72665a19"), "id" : "1", "name" : "哪吒程式設計", "age" : 18 } { "_id" : ObjectId("638c6685e96330d24f819176"), "id" : "1", "name" : "哪吒程式設計", "age" : 18 } { "_id" : ObjectId("638c6685e96330d24f81917f"), "id" : "10", "name" : "雲韻", "age" : 23 } { "_id" : ObjectId("638c6685e96330d24f819180"), "id" : "11", "name" : "美杜莎", "age" : 29 } { "_id" : ObjectId("638c6686e96330d24f819181"), "id" : "12", "name" : "蕭炎", "age" : 38 } > db.student.find().sort({"id":1}).skip(5).limit(5) { "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "雲韻", "age" : 23 } { "_id" : ObjectId("638c6685e96330d24f819177"), "id" : "2", "name" : "雲韻", "age" : 23 } { "_id" : ObjectId("638b6b8582bdbdfa72665a1c"), "id" : "3", "name" : "蕭炎", "age" : 38 } { "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] } { "_id" : ObjectId("638c6685e96330d24f819178"), "id" : "3", "name" : "美杜莎", "age" : 29 } > db.student.find().sort({"id":1}).skip(10).limit(5) { "_id" : ObjectId("638c6685e96330d24f819179"), "id" : "4", "name" : "蕭炎", "age" : 38 } { "_id" : ObjectId("638c6685e96330d24f81917a"), "id" : "5", "name" : "哪吒程式設計", "age" : 18 } { "_id" : ObjectId("638c6685e96330d24f81917b"), "id" : "6", "name" : "雲韻", "age" : 23 } { "_id" : ObjectId("638c6685e96330d24f81917c"), "id" : "7", "name" : "美杜莎", "age" : 29 } { "_id" : ObjectId("638c6685e96330d24f81917d"), "id" : "8", "name" : "蕭炎", "age" : 38 } >
可以通過以下方式:
到此這篇關於MongoDB查詢與遊標之徹底玩轉分散式檔案儲存的文章就介紹到這了,更多相關MongoDB查詢與遊標內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45