Mongodb各種查詢[轉(zhuǎn)載]

[轉(zhuǎn)載]-原文地址:http://blog.csdn.net/lg632/article/details/70847143

  1. 基本查詢:
    構(gòu)造查詢數(shù)據(jù)欺冀。

    {
         "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"),
         "name" : "stephen",
         "age" : 35,
         "genda" : "male",
         "email" : "stephen@hotmail.com"
    }
    
    # 多條件查詢。下面的示例等同于 SQL 語(yǔ)句的 where name = "stephen" and age = 35
    db.test.find({"name":"stephen","age":35})
    { 
        "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
        "name" : "stephen", 
        "age" : 35, 
        "genda" : "male", 
        "email" : "stephen@hotmail.com" 
     }
    # 返回指定的文檔鍵值對(duì)。下面的示例將只是返回name和age鍵值對(duì)。
    db.test.find({}, {"name":1,"age":1})
    { 
        "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
        "name" : "stephen", 
        "age" : 35
     }
    # 指定不返回的文檔鍵值對(duì)。下面的示例將返回除name之外的所有鍵值對(duì)。
     db.test.find({}, {"name":0})
    {
         "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
         "age" : 35, 
         "genda" : "male", 
         "email" : "stephen@hotmail.com"
    }```
    
    
  2. 查詢條件:
    MongoDB提供了一組比較操作符:

$lt $lte $gt $gte $ne $eq
< <= > >= != =
    # 下面的示例返回符合條件age >= 18 && age <= 40的文檔。
    db.test.find({"age":{"$gte":18, "$lte":40}})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,
      "genda" : "male", 
      "email" : "stephen@hotmail.com" }

    # 下面的示例返回條件符合name != "stephen1"
    db.test.find({"name":{"$ne":"stephen1"}})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,"genda" : "male", 
      "email" : "stephen@hotmail.com" }

    # $in等同于SQL中的in矩距,下面的示例等同于SQL中的in ("stephen","stephen1")
    db.test.find({"name":{"$in":["stephen","stephen1"]}})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,
      "genda" : "male", 
      "email" : "stephen@hotmail.com" }  

    # 和SQL不同的是,MongoDB的in list中的數(shù)據(jù)可以是不同類型怖竭。這種情況可用于不同類型的別名場(chǎng)景锥债。
    db.test.find({"name":{"$in":["stephen",123]}})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,
      "genda" : "male", 
      "email" : "stephen@hotmail.com" } 

    # $nin等同于SQL中的not in,同時(shí)也是$in的取反痊臭。如:
    db.test.find({"name":{"$nin":["stephen2","stephen1"]}})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,
      "genda" : "male", 
      "email" : "stephen@hotmail.com" }

    # $or等同于SQL中的or哮肚,$or所針對(duì)的條件被放到一個(gè)數(shù)組中,每個(gè)數(shù)組元素表示or的一個(gè)條件广匙。
    # 下面的示例等同于name = "stephen1" or age = 35
    db.test.find({"$or": [{"name":"stephen1"}, {"age":35}]})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,
      "genda" : "male", 
      "email" : "stephen@hotmail.com" } 

    # 下面的示例演示了如何混合使用$or和$in允趟。
    db.test.find({"$or": [{"name":{"$in":["stephen","stephen1"]}}, {"age":36}]})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,
      "genda" : "male", 
      "email" : "stephen@hotmail.com" } 

    # $not表示取反,等同于SQL中的not鸦致。
    db.test.find({"name": {"$not": {"$in":["stephen2","stephen1"]}}})
    { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a"), 
      "name" : "stephen", 
      "age" : 35,
      "genda" : "male", 
      "email" : "[stephen@hotmail.com](mailto:stephen@hotmail.com)" }
  1. null數(shù)據(jù)類型的查詢:
    # 在進(jìn)行值為null數(shù)據(jù)的查詢時(shí)盆犁,所有值為null,以及不包含指定鍵的文檔均會(huì)被檢索出來(lái)侈沪。
    db.test.find({"x":null})
    { 
      "_id" : ObjectId("4fd59d30b9ac507e96276f1b"), 
      "x" : null 
    }
    { 
      "_id" : ObjectId("4fd59d49b9ac507e96276f1c"), 
      "y" : 1 
    }

    # 需要將null作為數(shù)組中的一個(gè)元素進(jìn)行相等性判斷,即便這個(gè)數(shù)組中只有一個(gè)元素狮斗。
    # 再有就是通過(guò)$exists判斷指定鍵是否存在。
    db.test.find({"x": {"$in": [null], "$exists":true}})
    { 
      "_id" : ObjectId("4fd59d30b9ac507e96276f1b"), 
      "x" : null 
    }
  1. 正則查詢:
    # MongoDB中使用了Perl規(guī)則的正則語(yǔ)法弧蝇。如:
    db.test.find()
    {
       "_id" : ObjectId("4fd59ed7b9ac507e96276f1d"), 
       "name" : "stephen" 
    }
    { 
        "_id" : ObjectId("4fd59edbb9ac507e96276f1e"), 
        "name" : "stephen1" 
    }

    # i表示忽略大小寫
    db.test.find({"name":/stephen?/i})
    { 
        "_id" : ObjectId("4fd59ed7b9ac507e96276f1d"), 
        "name" : "stephen" 
    }
    { 
        "_id" : ObjectId("4fd59edbb9ac507e96276f1e"), 
        "name" : "stephen1" 
    } 
  1. 數(shù)組數(shù)據(jù)查詢:
    # 基于數(shù)組的查找情龄。
    db.test.find()
    { 
        "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), 
        "fruit" : [ "apple", "banana", "peach" ] 
    }
    { 
        "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), 
        "fruit" : [ "apple", "kumquat","orange" ] 
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "cherry", "banana","apple" ] 
    }

    # 數(shù)組中所有包含banana的文檔都會(huì)被檢索出來(lái)。
    db.test.find({"fruit":"banana"})
    { 
        "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), 
        "fruit" : [ "apple", "banana", "peach" ] 
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "cherry", "banana","apple" ] 
    }
    # 檢索數(shù)組中需要包含多個(gè)元素的情況捍壤,這里使用$all。
    # 下面的示例中鞍爱,數(shù)組中必須同時(shí)包含apple和banana鹃觉,但是他們的順序無(wú)關(guān)緊要。
    db.test.find({"fruit": {"$all": ["banana","apple"]}})
    { 
        "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), 
        "fruit" : [ "apple", "banana", "peach" ] 
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "cherry", "banana", "apple" ] 
    } 
    # 下面的示例表示精確匹配睹逃,即被檢索出來(lái)的文檔盗扇,fruit值中的數(shù)組數(shù)據(jù)必須和查詢條件完全匹配,即不能多沉填,也不能少疗隶,順序也必須保持一致。
    db.test.find({"fruit":["apple","banana","peach"]})
    { 
        "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), 
        "fruit" : [ "apple", "banana", peach" ] 
    } 
    # 下面的示例將匹配數(shù)組中指定下標(biāo)元素的值翼闹。數(shù)組的起始下標(biāo)是0斑鼻。
    db.test.find({"fruit.2":"peach"})
    { 
         "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), 
         "fruit" : [ "apple", "banana", peach" ] 
    } 
    # 可以通過(guò)$size獲取數(shù)組的長(zhǎng)度,但是$size不能和比較操作符聯(lián)合使用猎荠。
    db.test.find({"fruit": {$size : 3}})
    { 
        "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), 
        "fruit" : [ "apple", "banana", "peach" ] 
    }
    { 
        "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), 
        "fruit" : [ "apple", "kumquat","orange" ] 
    }
    {
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "cherry", "banana","apple" ] 
    } 
    # 如果需要檢索size > n的結(jié)果坚弱,不能直接使用$size,只能是添加一個(gè)額外的鍵表示數(shù)據(jù)中的元素?cái)?shù)據(jù)关摇,在操作數(shù)據(jù)中的元素時(shí)荒叶,需要同時(shí)更新size鍵的值。為后面的實(shí)驗(yàn)構(gòu)造數(shù)據(jù)输虱。
    db.test.update({}, {"$set": {"size":3}},false,true)
    db.test.find()
    { 
        "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), 
        "fruit" : [ "apple", "kumquat", "orange" ], 
        "size" : 3 
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "cherry", "banana", "apple" ], 
        "size" : 3 
    } 

    # 每次添加一個(gè)新元素些楣,都要原子性的自增size一次。
    test.update({},{"$push": {"fruit":"strawberry"},"$inc":{"size":1}},false,true)
    db.test.find()
    { 
        "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), 
        "fruit" : [ "apple", "kumquat", "orange", "strawberry" ], 
        "size" : 4 
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "cherry", "banana", "apple", "strawberry" ], 
        "size" : 4 
    }

    # 通過(guò)$slice返回?cái)?shù)組中的部分?jǐn)?shù)據(jù)宪睹。"$slice":2表示數(shù)組中的前兩個(gè)元素愁茁。
    db.test.find({},{"fruit": {"$slice":2}, "size":0})
    { 
        "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), 
        "fruit" : [ "apple", "kumquat" ]
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "cherry", "banana" ]
    } 
    # 通過(guò)$slice返回?cái)?shù)組中的部分?jǐn)?shù)據(jù)。"$slice":-2表示數(shù)組中的后兩個(gè)元素亭病。
    db.test.find({},{"fruit": {"$slice":-2}, "size":0})
    { 
        "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), 
        "fruit" : [ "orange", "strawberry" ] 
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "apple", "strawberry" ] 
    }

    # $slice : [2,1]埋市,表示從第二個(gè)2元素開始取1個(gè),如果獲取數(shù)量大于2后面的元素?cái)?shù)量命贴,則取后面的全部數(shù)據(jù)道宅。
    db.test.find({},{"fruit": {"$slice":[2,1]}, "size":0})
    { 
        "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), 
        "fruit" : [ "orange" ] 
    }
    { 
        "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), 
        "fruit" : [ "apple" ] 
    }
  1. 內(nèi)嵌文檔查詢:
    # 為后面的示例構(gòu)造測(cè)試數(shù)據(jù)食听。
    db.test.find()
    { 
        "_id" : ObjectId("4fd5ada3b9ac507e96276f22"), 
        "name" : { "first" : "Joe", "last" : "He" }, 
        "age" : 45 
    }
   # 當(dāng)嵌入式文檔為數(shù)組時(shí),需要$elemMatch操作符來(lái)幫助定位某一個(gè)元素匹配的情況污茵,否則嵌入式文件將進(jìn)行全部的匹配樱报。
   # 即檢索時(shí)需要將所有元素都列出來(lái)作為查詢條件方可。
    > db.test.findOne()
    {
         "_id" : ObjectId("4fd5af76b9ac507e96276f23"),
         "comments" : [
                 {
                         "author" : "joe",
                         "score" : 3
                 },
                 {
                         "author" : "mary",
                         "score" : 6
                 }
           ]
    }
    db.test.find({"comments": {"$elemMatch": {"author":"joe","score":{"$gte":3}}}}
    { 
        "_id" : ObjectId("4fd5af76b9ac507e96276f23"), 
        "comments" : [ 
                  { 
                          "author" : "joe", 
                          "score" : 3 
                  }, 
                  { 
                          "author" : "mary", 
                          "score" : 6 
                  } 
            ] 
    }
  1. 游標(biāo):
    # 數(shù)據(jù)庫(kù)使用游標(biāo)來(lái)返回find()的執(zhí)行結(jié)果泞当,客戶端對(duì)游標(biāo)可以進(jìn)行有效的控制迹蛤,如:限定結(jié)果集的數(shù)量、跳過(guò)部分結(jié)果襟士、基于任意鍵的任意方向的排序等盗飒。
    # 下面的例子將用于準(zhǔn)備測(cè)試數(shù)據(jù)。
    db.testtable.remove()
    for (i = 0; i < 10; ++i) {
            db.testtable.insert({x:i})
        }
    # 我們可以通過(guò)cursor提供的hasNext()方法判斷是否還有未讀取的數(shù)據(jù)陋桂,再通過(guò)next()方法讀取結(jié)果集中的下一個(gè)文檔逆趣。如:
    var c = db.testtable.find()
    while (c.hasNext()) {
            print(c.next().x)
            }
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 當(dāng)調(diào)用find()的時(shí)候,shell并不立即查詢數(shù)據(jù)庫(kù)嗜历,而是等待真正開始要求獲得結(jié)果的時(shí)候才發(fā)送查詢宣渗,這樣在執(zhí)行之前可以給查詢附加額外的選項(xiàng)。幾乎所有的游標(biāo)方法都返回本身梨州,因此可以像下面這樣將游標(biāo)的方法鏈?zhǔn)浇M合起來(lái)痕囱。如:
    var c1 = db.testtable.find().sort({"x":1}).limit(1).skip(4);
    var c2 = db.testtable.find().limit(1).sort({"x":1}).skip(4);
    var c3 = db.testtable.find().skip(4).limit(1).sort({"x":1});
    # 此時(shí),查詢并未執(zhí)行暴匠,所有這些函數(shù)都是在構(gòu)造查詢鞍恢,當(dāng)執(zhí)行下面的語(yǔ)句時(shí),查詢將被真正執(zhí)行每窖,
    c.hasNext()
    # 查詢被發(fā)送到服務(wù)器有序,MongoDB服務(wù)器每次將返回一批數(shù)據(jù),當(dāng)本批被全部迭代后再?gòu)姆?wù)器讀取下一批數(shù)據(jù)岛请,直至查詢結(jié)果需要的數(shù)據(jù)被全部迭代旭寿。

    # 對(duì)于上面的示例,limit(1)表示輸出結(jié)果僅為一個(gè)崇败,如果小于1盅称,則不輸出,即limit(n)函數(shù)限定的是最多輸出結(jié)果后室。
    # skip(4)表示跳過(guò)查詢結(jié)果中的前4個(gè)文檔缩膝,如果結(jié)果小于4,則不會(huì)返回任何文檔岸霹。
    # sort({"x":1})用于設(shè)定排序條件疾层,即按照x鍵以升序(1)的方式排序,如果需要降序排序可以改為:sort({"x":-1})贡避。
    # sort也可以支持多鍵排序痛黎,如:sort({username:1, age:-1})即先按照username進(jìn)行升序排序予弧,如果username的值相同,再以age鍵進(jìn)行降序排序湖饱。這里需要指出的是掖蛤,如果skip過(guò)多的文檔,將會(huì)導(dǎo)致性能問(wèn)題井厌。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚓庭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仅仆,更是在濱河造成了極大的恐慌器赞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓拜,死亡現(xiàn)場(chǎng)離奇詭異港柜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)撮弧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姚糊,“玉大人贿衍,你說(shuō)我怎么就攤上這事【群蓿” “怎么了贸辈?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肠槽。 經(jīng)常有香客問(wèn)我擎淤,道長(zhǎng),這世上最難降的妖魔是什么秸仙? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任嘴拢,我火速辦了婚禮,結(jié)果婚禮上寂纪,老公的妹妹穿的比我還像新娘席吴。我一直安慰自己,他們只是感情好捞蛋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布孝冒。 她就那樣靜靜地躺著,像睡著了一般拟杉。 火紅的嫁衣襯著肌膚如雪庄涡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天搬设,我揣著相機(jī)與錄音穴店,去河邊找鬼撕捍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迹鹅,可吹牛的內(nèi)容都是我干的卦洽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斜棚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阀蒂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弟蚀,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚤霞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后义钉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧绣,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年捶闸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夜畴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡删壮,死狀恐怖贪绘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情央碟,我是刑警寧澤税灌,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站亿虽,受9級(jí)特大地震影響菱涤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洛勉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一粘秆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧收毫,春花似錦翻擒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至引润,卻和暖如春巩趁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工议慰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蠢古,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓别凹,卻偏偏與公主長(zhǎng)得像草讶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炉菲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353