MongoDB學習筆記五—查詢

来源:http://www.cnblogs.com/ginb/archive/2016/12/23/6200721.html
-Advertisement-
Play Games

數據準備 find find的第一個參數決定了要返回哪些文檔,用於指定查詢條件。要不指定查詢文檔,預設就是{},指定多個鍵/值對,相當於sql的and。第二個參數來指定想要的鍵(預設情況下,"_id"總是顯示)。 查詢條件 And查詢 使用AND型查詢時,應儘可能用最少的條件來限定結果的範圍。 當然 ...


數據準備

{ "goods_id" : 1, "goods_name" : "KD876", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
{ "goods_id" : 3, "goods_name" : "諾基亞原裝5800耳機", "createTime" : ISODate("2016-10-09T00:00:00Z") }
{ "goods_id" : 5, "goods_name" : "索愛原裝M2卡讀卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 6, "goods_name" : "勝創KINGMAX記憶體卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 7, "goods_name" : "諾基亞N85", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 8, "goods_name" : "飛利浦9@9v", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 9, "goods_name" : "諾基亞E66", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "10", "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 11, "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 12, "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 13, "goods_name" : "諾基亞5320", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 14, "goods_name" : "諾基亞5800XM", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "15", "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 16, "goods_name" : "恆基偉業G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 17, "goods_name" : "夏新N7", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }

find

find的第一個參數決定了要返回哪些文檔,用於指定查詢條件。要不指定查詢文檔,預設就是{},指定多個鍵/值對,相當於sqland。第二個參數來指定想要的鍵(預設情況下,"_id"總是顯示)。

查詢條件

And查詢

使用AND型查詢時,應儘可能用最少的條件來限定結果的範圍。

> db.product.find({"goods_id":"4","goods_name":"諾基亞N85原裝充電器"},{"_id":0})
{ "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") }

當然也可以這樣(純屬閑得蛋疼):

> db.product.find({"$and":[{"goods_id":"4","goods_name":"諾基亞N85原裝充電器"}]},{"_id":0})
{ "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") }

Or查詢

方式一:$in$nin

$in可以用來查詢一個鍵的多個值,可以指定不同類型的條件和值。

$nin將返回與數組中所有條件都不匹配的文檔。

$in是對單個鍵做OR查詢。

> db.product.find({"goods_id":{"$in":["4",5,6]}},{"_id":0})
{ "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
{ "goods_id" : 5, "goods_name" : "索愛原裝M2卡讀卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 6, "goods_name" : "勝創KINGMAX記憶體卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
> 

方式二:$or

$or更通用一些,可以在多個鍵中查詢任意的給定值

使用$or時,第一個條件條件應儘可能匹配更多的文檔,這樣才是最為高效的。

> db.product.find({"$or":[{"goods_id":16},{"goods_name":"夏新T5"},{"createTime":{"$lt":new Date("2016-01-01")}}]},{"_id":0})
{ "goods_id" : 16, "goods_name" : "恆基偉業G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }

$lt、 $lte、 $gt、 $gte、$eq(貌似沒什麼用)、$ne

$lt$lte$gt$gte、$eq、$ne分別對應sql中的<<= >>=、=、!=。組合查找一個範圍的值。

> db.product.find({"goods_id":{"$gte":3,"$lt":5}},{"_id":0} )
{ "goods_id" : 3, "goods_name" : "諾基亞原裝5800耳機", "createTime" : ISODate("2016-10-09T00:00:00Z") }
> start=new Date("01/01/2016")
 ISODate("2015-12-31T16:00:00Z")

> db.product.find({"createTime":{"$lt":start}})//查詢指定日期之前的數據
{ "_id" : ObjectId("585a65d9a847c6d3a3ee1da5"), "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }

限制

查詢使用上有些限制。傳遞給資料庫的查詢文檔的值必須是常量。也就是說不能引用文檔中其他鍵的值。

 db.product.find({"goods_id":this.goods_name}).pretty()

$mod

取模運算符,會將查詢的值除以第一個給定值,若餘數等於第二個給定的值則匹配成功。

> db.product.find({"goods_id":{"$mod":[5,1]}},{"_id":0})
{ "goods_id" : 1, "goods_name" : "KD876", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 6, "goods_name" : "勝創KINGMAX記憶體卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 11, "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 16, "goods_name" : "恆基偉業G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
> 

$not

$not是元條件句,即可以用在其他任何其他條件之上。查詢和匹配的件相反的數據。

$not與正則表達式聯合使用時極為有用,用來查找那些與特定模式不匹配的文檔。

> db.product.find({"goods_id":{"$not":{"$mod":[5,1]}}},{"_id":0})
{ "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
{ "goods_id" : 3, "goods_name" : "諾基亞原裝5800耳機", "createTime" : ISODate("2016-10-09T00:00:00Z") }
{ "goods_id" : 5, "goods_name" : "索愛原裝M2卡讀卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 7, "goods_name" : "諾基亞N85", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 8, "goods_name" : "飛利浦9@9v", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 9, "goods_name" : "諾基亞E66", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "10", "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 12, "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 13, "goods_name" : "諾基亞5320", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 14, "goods_name" : "諾基亞5800XM", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : "15", "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 17, "goods_name" : "夏新N7", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }

條件語義

在查詢中,$lt在內層文檔,而在更新中$inc則是外層文檔的鍵。

基本可以肯定:條件語句是內層文檔的鍵,而修改器則是外層文檔的鍵。

一個鍵可以有任意多個條件,但是一個鍵不能對應多個更新修改器。

有一些”元操作符”也位於外層文檔中,比如$and$or$nor

查詢優化器不會$and進行優化,這與其他操作符不相同。

特定類型的查詢

null

null不僅會匹配某個鍵的值為null的文檔,而且還會匹配不含這個鍵的文檔。

如果僅想匹配鍵值為null的文檔,既要檢查該鍵的值是否為null,還要通過$exists條件判斷鍵值已存在。

> db.product.update({"goods_id":2},{"$set":{"goods_name":null}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.product.find({"goods_name":null},{"_id":0})
{ "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z"), "goods_name" : null }
> db.product.find({"goods_no":{"$in":[null],"$exists":true}},{"_id":0})

正則表達式

正則表達式能夠靈活有效地匹配字元串,系統可以接收正則表達式標誌i (忽略大小寫),但不一定要有。

MongoDB可以為首碼型正則表達式(比如:/^joey/)查詢創建索引,所以這種類型的查詢會非常高效。

> db.product.find({"goods_name":/^三星/},{"_id":0})
{ "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
{ "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }

正則表達式也可以匹配自身。

> db.product.find({"goods_name":/baz/},{"_id":0})
{ "goods_id" : 3, "goods_name" : /baz/, "createTime" : ISODate("2016-10-09T00:00:00Z") }

查詢數組

查詢數組元素與查詢標量值是一樣的。

> db.product.update({"goods_id":"10"},{"$push":{"goods_type":{"$each":["華為", "樂視", "小米"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.product.find({"goods_type":"小米"},{"_id":0})
{ "goods_id" : "10", "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z"), "goods_type" : [ "華為", "樂視", "小米" ] }

$all

通過多個元素來匹配數組,這樣就會匹配一組元素。

> db.product.update({"goods_id":20},{"$push":{"goods_type":{"$each":["三星", "蘋果", "努比亞"]}}})> db.product.update({"goods_id":18},{"$push":{"goods_type":{"$each":["華為", "蘋果", "魅族"]}}})

> db.product.find({"goods_type":{"$all":["蘋果","華為"]}},{"_id":0})
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z"), "goods_type" : [ "華為", "蘋果", "魅族" ] }

當然也可以使用整個數組進行精確匹配。但是,精確匹配必須一模一樣的才查的出來,比如順序,個數都得一樣。

> db.product.find({"goods_type":["華為","蘋果","魅族"]},{"_id":0})
{ "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z"), "goods_type" : [ "華為", "蘋果", "魅族" ] }

查找特定位置的元素

要想查詢數組特定位置的元素,需使用key.index語法指定下標,數組下標都是從0開始的。

> db.product.find({"goods_type.1":"蘋果"},{"_id":0})
{ "goods_id" : 18, "	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於“靜態類型檢查”,想必使用C 或Java 的各位應該非常熟悉了。在此過程中將檢查表達式的類型,發現類型不正確的操作時就會報錯。例如結構體之間無法用+ 進行加法運算,指針和數值之間無法用* 進行乘法運算,將數組傳遞給參數類型為int 型的函數會出現莫名其妙的結果。在編譯過程中檢查是否符合這樣的限制 ...
  • 微信小程式可以通過生成帶參數的二維碼,那麼這個參數是可以通過APP的頁面進行監控的 這樣就可以統計每個二維碼的推廣效果。 今天由好推二維碼推出的小程式統計工具HotApp小程式統計也推出了帶參數二維碼統計功能 幫助統計每個渠道的二維碼的推廣效果,用戶使用情況,留存,付費等。 網址是: www.wei ...
  • 一、ContentProvider保存數據介紹 一個程式可以通過實現一個ContentProvider的抽象介面將自己的數據完全暴露出去,而且ContentProvider是以類似資料庫中表的方式將數據暴露的。那麼外界獲取其提供的數據,也就應該與從資料庫中獲取數據的操作基本一樣,只不過是採用URL來 ...
  • 由OpenDigg 出品的iOS開源項目周報第二期來啦。我們的iOS開源周報集合了OpenDigg一周來新收錄的優質的iOS開發方面的開源項目,方便iOS開發人員便捷的找到自己需要的項目工具等。 ...
  • HotApp小程式統計,第一個專業的微信第三方小程式監控統計工具 1.什麼是HotApp小程式統計 HotApp小程式統計是第一個微信第三方小程式統計工具,就像做android 和 ios開發的人知道友盟統計一樣,小程式也需要有個統計工具。 通過這個工具,可以知道小程式的每日新增,每日啟動次數,總用 ...
  •   直播的採集由採集的設備(攝像頭、話筒)不同分為視頻採集和音頻採集,本篇文章會分別介紹。 1.採集步驟   1.創建捕捉會話(AVCaptureSession),iOS調用相機和話筒之前都需要創建捕捉對話,把輸入輸出設備添加進對話中。  &emsp ...
  • 一、在res/menu文件夾下創建Xml文件 跟標簽為menu,設置item <?xml version="1.0" encoding="utf-8"?> <myapp:menu xmlns:android="http://schemas.android.com/apk/res/android" x ...
  • 這個錯誤是因為有兩個相同的jar包,刪除其中一個就可以正常運行了。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...