mongodb——curd的其他知識點

這篇博客,我們來介紹幾種查詢的騷操作。

投影(projection)——返回指定的字段

在mongodb的查詢中,可以通過一個bson來指定在這個查詢裏返回的字段。如果不指定,則默認全部返回。bson的格式如下:

{ field1: <value>, field2: <value> ... }

value:
1或者true表示在返回的文檔中需要包含的字段
0或者false表示不返回該字段

例:

db.test.find()

結果爲:
{ “_id” : ObjectId(“5d11c1dd4a715b97743cfabe”), “name” : “tom”, “age” : 13, “like” : “apple” }
{ “_id” : ObjectId(“5d11cc6f4a715b97743cfabf”), “name” : “tom”, “age” : 14, “like” : “apple” }
{ “_id” : ObjectId(“5d3ee58653166082cbd19439”), “favorite” : { “sport” : “soccer”, “fruit” : [ “apple”, “peach” ] } }

只返回某些字段:

 db.test.find({age:13},{name:1,_id:0})

結果爲:
{ “name” : “tom” }

排除某些字段:

db.test.find({age:13},{name:0,_id:0})

結果爲:
{ “age” : 13, “like” : “apple” }

返回嵌入文檔的指定字段

 db.test.find({},{"favorite.sport":1,_id:0})

結果爲:
{ “favorite” : { “sport” : “soccer” } }

返回嵌入文檔的數組

 db.test.find({},{"favorite.fruit":1,_id:0})

結果爲:
{ “favorite” : { “fruit” : [ “apple”, “peach” ] } }


1:當要返回_id時,不需要顯示註明_id:1,查詢方法默認都是返回的。當顯示註明_id:0時纔不會返回。
2:對於一個查詢語句,不能同時指定一個屬性爲1,另一個屬性爲0(_id是唯一一個可以顯示排除的)

null值查詢

我們現在數據庫中插入兩條記錄

db.test.insert(
   [
      { "x" : 1, "y" : null },
      { "x" : 2 }
   ]
)

當我們想要查詢y:null數據時,可能會使用如下的查詢語句:

db.test.find({y:null})

結果爲:
{ “_id” : ObjectId(“5d773d6a50b8e96191afdf53”), “x” : 1, “y” : null }
{ “_id” : ObjectId(“5d773d6a50b8e96191afdf54”), “x” : 2 }

我們有沒有查詢 { “x” : 1, “y” : null }這條記錄的方法呢?
答:有。
*第一種方法:*給mongo庫加上稀疏索引(只會存儲被建立索引的屬性有值的文檔)。加上以後,我們就只會查詢到顯示的null值。
*第二種方法:*使用{$type:10}進行類型篩選,也只會匹配出顯示指定的null。

如果想要查不存在這個屬性的文檔也有方法——使用{$exists:false}進行屬性存在性篩選。

find的數值大小比較

操作 格式 示例
等於 {key:value} db.test.find({name:“tom”})
小於 {key:{$lt:value}} db.test.find({age:{$lt:14}})
小於等於 {key:{$lte:value}} db.test.find({age:{$lt:13}})
大於 {key:{$gt:value}} db.test.find({age:{$gt:13}})
大於等於 {key:{$gte:value}} db.test.find({age:{$gte:14}})
不等於 {key:{$ne:value}} db.test.find({age:{$ne:13}})
大於一個數且小於另一個數 {key:{$gt:value1,$lt:value2}} db.test.find({age:{$gt:13,$lt:15}})
大於一個數或者小於另一個數 {$or:[{key:{$gt:value1}},{key:{$lt:value2}}]} db.test.find({$or:[{age:{$gt:15}},{age:{$lt:14}}]})
大於一個數或者等於另一個數 {$or:[{key:{$gt:value1}},{key:value2}]} db.test.find({$or:[{age:{$gt:15}},{age:14}]})

注:上面的操作中 大家要尤其注意大於一個數且小於另一個數的寫法,如果寫成{key:{$gt:value1},{key:{$lt:value2}}則意義就會不一樣了。大家可以自己去試一下

遊標

mongo的find方法會返回一個cursor遊標。
如果沒有把這個遊標賦值給變量,則遊標會自動在shell中迭代20次(打印出find結果的前20行);
當通過var把遊標賦值給一個變量後,在shell命令行則不會進行默認迭代
如:

var result = db.test.find();

當我們需要在命令行輸出查詢結果的時候,輸入result則遊標會向下迭代20次(即打印20次結果),當輸入result.next()時,遊標會迭代一次(即打印1次結果)

limit,skip,sort

顧名思義,limit(n)是指定查詢結果返回的記錄數,skip(n)是跳過指定數量的結果,sort({key:options})表示按照一定順序排序。
sort({key:1}):表示對key字段升序排序,
sort({key:0}):表示對key字段降序排序

limit和skip可以實現小數據量的分頁,如果數據量太大就不適用skip方法,因爲skip方法是一條一條數過去的。數據量大的時候,可以利用某些字段有序的性質,使用find來代替sort進行分頁,效率會大大提高。
比如我們在文檔結構上面增加了邏輯上的自增值:
我們就可以使用$gt,limit組合來代替sort,skip,limit組合了。

:skip(), limilt(), sort()三個放在一起執行的時候,執行的順序是先 sort(), 然後是 skip(),最後是顯示的 limit()。

我們由此可以看出$操作符非常的強大。我們將會在之後專門用1~2篇幅來講$操作符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章