1. 程式人生 > >MongoDB高階查詢語句

MongoDB高階查詢語句

本文介紹MongoDB的高階查詢語句

MongoDB支援的查詢語言非常強大,語法規則類似於面向物件的查詢語言,可以實現類似關係資料庫單表查詢的絕大部分功能,並且由於MongoDB可以支援複雜的資料結構,不受二維表形式的限制,因此MongoDB的查詢速度非常快。下面介紹一些MongoDB的高階查詢語法。

1、條件操作符查詢

所謂條件操作符,就是< 、<=、>、>=這些符號,相應的查詢語法如下:

db.collection.find({"key":{$gt:value}});  //大於  key>value

db.collection.find({"key"
:{$gte:value}}); //大於等於 key>=value db.collection.find({"key":{$lt:value}}); //小於 key<value db.collection.find({"key":{$lte:value}}); //小於等於 key<=value

上面的collection是一個集合名。key是要查詢的欄位,value是比較的範圍。SQL為:select * from collection where key > (或者>=,<,<=)value,

2、$all匹配所有的值

這個操作與SQL語法的in類似,但是in只需要滿足範圍之一的值就可以,但是$all必須滿足所有的值。例如

db.collection.find({age:{$all:[20,21]}});

可以查詢出來 {age:[20,21,22]} 但是查詢不出來 {age:[20,22,23]},即一定要有20和21.

3、$in查詢包含的值

這個與allin給出的範圍之內就都可以查出來。例如

db.collection.find({age:{$in:[20,21]}});

可以查詢出來 {age:[20,21,22]} 和 {age:[20,22,23]} 以及 {age:[21,22,23]},即只需要有20或者21其中之一的都可以。

4、$exists判斷欄位是否存在

可以用$exists判斷某一欄位是否存在,例如查詢存在age欄位的記錄

db.collection.find({age:{$exists:true}});

查詢不存在age欄位的記錄

db.collection.find({age:{$exists:false}});

5、null值的處理

null值處理需要注意的是,不僅僅可以查詢出來某一欄位值為null的記錄,還可以查出來不存在某一欄位的記錄。例如

db.collection.find({age:null})

可以查詢出來age為null的記錄,以及沒有age欄位的記錄。如果我們需要只去查詢存在age欄位並且age欄位的值為null的記錄,需要配合exists操作,例如

db.collection.find({age:{"$in":[null],"$exists":true}});

即查詢存在age欄位的並且age欄位值為null的記錄

6、$mod取模運算

這個操作可以進行模運算。例如,查詢age取模5等於3的記錄

db.collection.find({age:{$mod:[5,3]}});

7、$ne不等於操作

可以查詢不等於某一欄位的資料,例如,查詢age不等於20的記錄

db.collection.find({age:{$ne:20}});

8、$nin不包含操作

這個與$in相反,查詢不包含某一欄位的記錄,例如查詢age不等於20,21,22的記錄

db.collection.find({age:{$nin:[20,21,22]}});

9、count查詢記錄條數

這個可以用來知道查詢到記錄的條數,例如查詢age等於20的記錄數目

db.collection.find({age:20}).count();

10、排序

用sort函式排序,例如按照age升序排列

db.collection.find().sort({age:1})

類似asc,

按照age降序排列

db.collection.find().sort({age:-1})

類似desc。同時也可以在find裡面新增查詢條件。

11、skip和limit語句

這個是用來跳過幾條記錄然後查詢指定數目的記錄,例如跳過3條記錄查詢其餘記錄的最前面5條,

db.collection.find().skip(3).limit(5);

find裡面可以加條件,這個類似SQL:select * from collection limit(3,5)

12、JavaScript查詢和$where查詢

例如,查詢age大於20的記錄,可以分別用到如下的方式:

db.collection.find({age:{$gt:20}});

這是條件操作符方式,

db.collection.find({$where:"this.age > 3"});

這是$where方式

db.collection.find("this.age > 3");

這是內部物件查詢

func=function(){return this.age > 3;} db.collection.find(func)

這是JavaScript方式。這幾種方式都是一樣的效果。

13,儲存過程

MongoDB也可以有儲存過程。例如一個簡單的SQL儲存過程函式為

function addNum(x,y){

return x+y;}

現在要將這個函式轉化成MongoDB的儲存過程。Mongo的儲存過程是儲存在db.system.js表中的,可以這麼寫

db.system.js.save({_id:"addNum",value:function(x,y){return x+y;}});

這樣就建立了一個儲存過程。我們可以對儲存過程進行檢視、修改和刪除操作,例如檢視所有的儲存過程,

db.system.js.find()

,其餘修改和刪除類似對記錄的操作。

呼叫建立好的儲存過程,需要用到db.eval(),例如呼叫剛剛建立的addNum,是這樣

db.eval("addNum(30,12)");

就可以得出答案是42。

同時,可以直接使用db.eval來建立儲存過程並且直接呼叫,例如

db.eval(function(){return 30+12;});

可以直接得出42,這樣可以知道使用db.eval可以直接進行算數運算,非常方便。

還有就是,儲存過程可以處理資料庫內部的操作,例如

db.system.js.save({_id:"getCount",value:function(){return db.collection.find({age:20}).count();}});

可以將db.collection中age為20的記錄數目儲存在getCount這個儲存過程中,呼叫的時候這樣

db.eval("getCount()");

就可以直接取得那個數目。
14,陣列查詢
“$size”用來查詢陣列的長度.例如查詢fav長度為2的文件:

> db.test3.find({"fav":{"$size":2}})
{ "_id" : ObjectId("573e8b719e178b5475b29d91"), "name" : "tom", "fav" : [ "chess", "cooking" ] }

size使,slice操作符

find的第二個引數返回指定的鍵.這個特別的”$slice”操作符可以返回某個鍵匹配的陣列元素的一個子集.
例如我想返回前2個fav的值:

> db.test3.findOne({"name":"brent"},{"fav":{"$slice":2}})
{
    "_id" : ObjectId("573e874c9e178b5475b29d8e"),
    "name" : "brent",
    "fav" : [
        "game",
        "film"
    ]

如果想要返回後2個的值,就寫-2就可以了.
“$slice”也可以指定偏移量和返回的元素數量,例如:

> db.test3.findOne({"name":"brent"},{"fav":{"$slice":[1,2]}})
{
    "_id" : ObjectId("573e874c9e178b5475b29d8e"),
    "name" : "brent",
    "fav" : [
        "film",
        "read"
    ]
}

這表示跳過前面1個,從第二個開始返回兩個元素,如果元素不夠則返回所有的元素.
除非特別宣告,否則使用”$slice”將返回文件中的全部鍵.
返回一個匹配的陣列元素

如果知道元素的下標,那麼”slice",,使操作符 .
例如下面得到name為bob的,並且顯示任意一個評論:

> db.test4.findOne()
{
    "_id" : ObjectId("573f390c9e178b5475b29d92"),
    "name" : "brent",
    "comment" : [
        {
            "name" : "bob",
            "content" : "good"
        },
        {
            "name" : "jack",
            "content" : "repost"
        }
    ]
}
> db.test4.find({"comment.name":"bob"},{"comment.$":1})
{ "_id" : ObjectId("573f390c9e178b5475b29d92"), "comment" : [ { "name" : "bob", "content" : "good" } ] }