這篇文章將為大家詳細講解有關怎樣進行MongoDB文檔查詢操作,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
null的查詢稍微有點不同,假如我想查詢z為null的數據,如下:
db.sang_collect.find({z:null})
這樣不僅會查出z為null的文檔,也會查出所有沒有z字段的文檔,如果只想查詢z為null的字段,那就再多加一個條件,判斷一下z這個字段存在不,如下:
db.sang_collect.find({z:{$in:[null],$exists:true}})
使用正則表達式查詢我們在前面也已經介紹過了,這里的正則表達式語法和JavaScript中的正則表達式語法一致,比如查詢所有key為x,value以hello開始的文檔且不區分大小寫:
db.sang_collec.find({x:/^(hello)(.[a-zA-Z0-9])+/i})
假設我有一個數據集如下:
{ "_id" : ObjectId("59f1ad41e26b36b25bc605ae"), "books" : [ "三國演義", "紅樓夢", "水滸傳" ] }
查詢books中含有三國演義的文檔,如下:
db.sang_collect.find({books:"三國演義"})
如果要查詢既有三國演義又有紅樓夢的文檔,可以使用$all,如下:
db.sang_collect.find({books:{$all:["三國演義","紅樓夢"]}})
當然我們也可以使用精確匹配,比如查詢books為"三國演義","紅樓夢", "水滸傳"
的數據,如下:
db.sang_collect.find({books:["三國演義","紅樓夢", "水滸傳"]})
不過這種就會一對一的精確匹配。
也可以按照下標匹配,比如我想查詢數組中下標為2的項的為"水滸傳"
的文檔,如下:
db.sang_collect.find({"books.2":"水滸傳"})
也可以按照數組長度來查詢,比如我想查詢數組長度為3的文檔:
db.sang_collect.find({books:{$size:3}})
如果想查詢數組中的前兩條數據,可以使用$slice,如下:
db.sang_collect.find({},{books:{$slice:2}})
注意這里要寫在find的第二個參數的位置。2表示數組中前兩個元素,-2表示從后往前數兩個元素。也可以截取數組中間的元素,比如查詢數組的第二個到第四個元素:
db.sang_collect.find({},{books:{$slice:[1,3]}})
數組中的與的問題也值得說一下,假設我有如下數據:
{ "_id" : ObjectId("59f208bc7b00f982986c669c"), "x" : [ 5.0, 25.0 ] }
我想將數組中value取值在(10,20)之間的文檔獲取到,如下操作:
db.sang_collect.find({x:{$lt:20,$gt:10}})
此時上面這個文檔雖然不滿足條件卻依然被查找出來了,因為5<20
,而25>10
,要解決這個問題,我們可以使用$elemMatch,如下:
db.sang_collect.find({x:{$elemMatch:{$lt:20,$gt:10}}})
$elemMatch要求MongoDB同時使用查詢條件中的兩個語句與一個數組元素進行比較。
嵌套文檔有兩種查詢方式,比如我的數據如下:
{ "_id" : ObjectId("59f20c9b7b00f982986c669f"), "x" : 1.0, "y" : { "z" : 2.0, "k" : 3.0 } }
想要查詢上面這個文檔,我的查詢語句如下:
db.sang_collect.find({y:{z:2,k:3}})
但是這種寫法要求嚴格匹配,順序都不能變,假如寫成了db.sang_collect.find({y:{k:3,z:2}})
,就匹配不到了,因此這種方法不夠靈活,我們一般推薦的是下面這種寫法:
db.sang_collect.find({"y.z":2,"y.k":3})
這種寫法可以任意顛倒順序。
關于怎樣進行MongoDB文檔查詢操作就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。