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, "goods_name" : "
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 本篇文章會從源碼(基於Android 6.0)角度分析Android中View的繪製流程,側重於對整體流程的分析,對一些難以理解的點加以重點闡述,目的是把View繪製的整個流程把握好,而對於特定實現細節則可以日後再對相應源碼進行研讀。在進行實際的分析之前,我們先來看下麵這張圖: 我們來對上圖做 ...
  • 鎖終端 輸入: <1>cd /Applications/Xcode.app 回車 結果顯示: Xcode.app 輸入: <2>sudo chown -hR root:wheel Contents 回車 結果顯示: WARNING: Improper use of the sudo command ...
  • 經過努力終於發現了最新的 解決cocoaPods安裝的辦法: taobao Gems 源已停止維護,現由 ruby-china 提供鏡像服務 第一步:安裝rvm, 不管需不需要升級ruby,rvm可以讓你擁有多個版本的Ruby,並且可以在多個版本之間自由切換。如果已經安裝過跳到第2步(rvm -v ...
  • 在之前的博文《Android中使用ViewPager實現屏幕頁面切換和引導頁效果實現》和《Android中Fragment的兩種創建方式》以及《Android中Fragment與Activity之間的交互(兩種實現方式)》中我們介紹了ViewPager以及Fragment各自的使用場景以及不同的實現 ...
  • 一、概述 運行時變更就是設備在運行時發生變化(例如屏幕旋轉、鍵盤可用性及語言)。發生這些變化,Android會重啟Activity,這時就需要保存activity的狀態及與activity相關的任務,以便恢復activity的狀態。 為此,google提供了三種解決方案: 下麵會逐一介紹三種情況,其 ...
  • 查詢這塊是重中之重, 關係到系統反應時間. 項目做到後期, 都是要做性能測試和性能優化的, 優化的時候, 資料庫這塊是一個大頭. sql格式: select 列名/* from 表名 where 條件 group by 列 having 條件 order by 列 asc/desc; 這裡牽涉到一個 ...
  • 在平常備庫和資料庫遷移的時候,當遇到大的資料庫的時候在用exp的時候往往是需要好幾個小時,耗費大量時間。oracle10g以後可以用expdp來導出資料庫花費的時間要遠小於exp花費的時間,而且文件也要小很多。 1.使用expdp要先在資料庫中創建directory,並給相應的用戶read,writ ...
  • 查詢內嵌文檔 數據準備 方式1:查詢整個內嵌文檔 與普通查詢完全相同。但是,如果要查詢一個完整的子文檔,那麼子文檔必須精確匹配(順序以及個數都要一樣)。 > db.blog.find({"comments":{"author":"lf","votes":20}}) > 方式2:只針對其鍵/值對進行查 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...