《MongoDB管理与开发精要》——3.2节查询语法
3.2 查詢語法
MongoDB最大的特點(diǎn)是,它支持的查詢語言非常強(qiáng)大,其語法類似于面向?qū)ο蟮牟樵冋Z言,不但可以實(shí)現(xiàn)關(guān)系型數(shù)據(jù)庫查詢的大部分功能,而且還支持對數(shù)據(jù)建立索引。由于MongoDB可以支持非常復(fù)雜的數(shù)據(jù)結(jié)構(gòu),同時帶有強(qiáng)大的數(shù)據(jù)查詢功能,因此非常受歡迎,很多項(xiàng)目都考慮用MongoDB來替代MySQL等傳統(tǒng)數(shù)據(jù)庫來實(shí)現(xiàn)復(fù)雜的Web應(yīng)用。很多案例都是因?yàn)閿?shù)據(jù)量實(shí)在太大,所以遷移到MongoDB上,從而數(shù)據(jù)查詢的速度得到了非常顯著的提升。
3.2.1 數(shù)組內(nèi)容的查詢
MongoDB本身支持?jǐn)?shù)組類型的內(nèi)嵌對象,接下來講解如何查詢數(shù)組中的特定內(nèi)容。
數(shù)組內(nèi)容的查詢方法跟普通查詢方法沒有區(qū)別,只不過要查詢的是數(shù)組中的值,而不是單獨(dú)的值。
例如數(shù)據(jù)庫中的c1表,其中colors列存儲的就是一個數(shù)組,如下面代碼所示:
結(jié)果跟我們期望的一樣,包含“red”的記錄出現(xiàn)了。
3.2.2 內(nèi)嵌文檔的查詢
如果某一列存儲的不是一個單獨(dú)的值,而是一條有多個列的記錄,這條記錄叫做“內(nèi)嵌文檔”。所以查詢內(nèi)嵌文檔時,需要將條件細(xì)化到列上。
例如,數(shù)據(jù)庫中存在以下內(nèi)嵌式文檔數(shù)據(jù),其中author列的值對應(yīng)的就是內(nèi)嵌文檔。
結(jié)果跟我們期望的一樣,“author”是“wangwenlong”的記錄出現(xiàn)了。
注意 查詢內(nèi)嵌對象的屬性時,記得要加上引號("")。也就是說,字段是"author.name",而不是author.name。
3.2.3 正則表達(dá)式匹配
正則表達(dá)式就是用某種模式去匹配一類字符串的一個公式,它由一些普通的字符組成。
接下來講解如何使用正則表達(dá)式來進(jìn)行模糊查詢。例如,查詢不匹配“name=B*”開頭的記錄,如下面的代碼所示:
舉一個實(shí)際的例子,c1表的數(shù)據(jù)如下面的代碼所示:
> db.c1.find(); { "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 } { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }查詢name不以“T”開頭的數(shù)據(jù)如下面的代碼所示:
> db.c1.find({name: {$not: /^T.*/}}) { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }可以看出,只顯示“name=Tony”的數(shù)據(jù),其他不符合規(guī)則的數(shù)據(jù)并沒有顯示出來。
3.2.4 $where查詢
$where查詢允許在查詢里執(zhí)行JavaScript表達(dá)式。例如查詢a大于3的數(shù)據(jù),可以用普通的查詢方法,如下面的代碼所示:
db.c1.find( { a : { $gt: 3 } } );
注意 “$where查詢”是指采用類似于SQL中的where語句來進(jìn)行查詢的方式,但命令中并不包含where關(guān)鍵字。
也可以用$where的數(shù)值比較符號來查詢,如下面的代碼所示:
db.c1.find("this.a > 3");
但有一點(diǎn)需要注意,如非必要,盡量不要使用,因?yàn)橐坏┦褂?#xff0c;document都必須從BSON轉(zhuǎn)換為一個JavaScript對象,所以$where查詢比一般的查詢會慢很多。
總結(jié)
以上是生活随笔為你收集整理的《MongoDB管理与开发精要》——3.2节查询语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache activemq入门示例(
- 下一篇: Facebook推开源软件平台ParlA