MongoDB學習(查找文檔和其他數據查找操作)

来源:https://www.cnblogs.com/shangyang/archive/2019/04/06/10661538.html
-Advertisement-
Play Games

理解Cursor對象和查詢運算符 cursor對象 cursor對象相當於一個指針,可通過迭代它來訪問MongdoDB資料庫中的一組對象。 在使用 find() 方法查詢時,返回的並非實際文檔,而是一個Cursor對象,也就是一個指向第一個數據之前的指針。 Cursor對象內部存儲了一個指向當前位置 ...


理解Cursor對象和查詢運算符

cursor對象

  cursor對象相當於一個指針,可通過迭代它來訪問MongdoDB資料庫中的一組對象。

  在使用 find() 方法查詢時,返回的並非實際文檔,而是一個Cursor對象,也就是一個指向第一個數據之前的指針。

  Cursor對象內部存儲了一個指向當前位置的索引,可以保證每次讀取一個文檔。在MongoDB中,有些操作隻影響Cursor中的當前文檔,並將索引數加 1,而有些操作影響當前索引之後的所有文檔。

查詢運算符

  在進行查找時,可以使用一些查詢運算符來進行查詢匹配。以來判斷文檔中欄位的值是否符合指定的條件。類似與 sql 語句中 where 查詢後面的條件。

運算符 描述 示例
field:value 與欄位值為value的文檔匹配 { name : "myName" }
$gt 與欄位值大於指定值的文檔匹配 { size : { $gt : 5 } }
$gte 與欄位值大於等於指定值的文檔匹配 { size : { $gte : 5 } }
$in 與欄位值包含在指定數組中的文檔匹配 { like : { $in : [ "C","JAVA" ] } }
$lt 與欄位值小於指定值的文檔匹配 { size : { $lt : 5} }
$lte 與欄位值小於等於指定值的文檔匹配 { size : { $lte : 5 } }
$ne 與欄位值不等於指定值的文檔匹配 { name : {$ne : "badName"} }
$nin 與欄位值不包含在指定數組中的文檔匹配 { name : { $nin : ["html","css"] } }
$or 使用邏輯或連接查詢字句,並返回符合任何一個字句條件的文檔 { $or : [ {size : {$lt : 5} }, {size : {$gt : 10} } ] }
$and 使用邏輯與連接查詢字句,並返回與兩個字句條件都匹配的文檔 { $and : [ { size : { $gt : 5 } },{ size : { $lt : 10 } } ] }
$not 反轉查詢表達式的效果,返回與查詢表達式不匹配的文檔 { $not : { name : "myName" } }
$nor 使用邏輯或非連接查詢字句,返回與兩個字句都不匹配的文檔 { $nor : { size : { $gt : 5 } },{ size : { $lt : 0 } } }
$exists 值為 true 時匹配包含指定欄位的文檔,為 false 時返回不包含該欄位的文檔 { name : { $exists : true } }
$regex 返回指定欄位的值與指定正則表達式匹配的文檔 { myString : { $regex : ' some.*exp ' } }
$all 返回指定數組包含所有指定的元素的文檔 { word : { $all : [ 'a','b','c' ] } }
$elemMatch 返回指定的數組欄位至少有一個元素與指定的條件都匹配的文檔 { myArr : { $elemMatch : { { value : { $gt : 5 } },{ size : { $lt : 10 } } } } }
$size 指定數組的長度 { myArr : { $size : 5 } }

 

查詢文檔

find() 方法

  查詢集合中的文檔可以用 find() 方法進行查詢,其語法為

   find( query, projection)

  •   query :可選,使用查詢操作符指定查詢條件
  •   projection :可選,使用投影操作符指定返回的鍵。查詢時返迴文檔中所有鍵值, 只需省略該參數即可(預設省略)。

  find() 方法返回一個 find()Cursor對象,表示與查詢條件匹配的文檔。

function (query, fields, limit, skip, batchSize, options) {
    var cursor = new DBQuery(this._mongo,
                             this._db,
                             this,
                             this._fullName,
                             this._massageObject(query),
                             fields,
                             limit,
                             skip,
                             batchSize,
                             options || this.getQueryOptions());

    {
        const session = this.getDB().getSession();

        const readPreference = session._serverSession.client.getReadPreference(session);
        if (readPreference !== null) {
            cursor.readPref(readPreference.mode, readPreference.tags);
        }

        const readConcern = session._serverSession.client.getReadConcern(session);
        if (readConcern !== null) {
            cursor.readConcern(readConcern.level);
        }
    }

    return cursor;
}

   示例:

  

findOne()方法

  它的用法與 find() 相同,只是  findOne() 只返回與查詢條件匹配的第一個文檔。

  示例:

根據多個欄位查詢文檔

  根據多個欄位進行查詢時,可以將多個查詢欄位放在一個文檔中查詢,或者使用 $and 連接符進行連接。

  註意:根據多個欄位查詢文檔時,若將多個欄位放在多個文檔中查詢時,只能根據第一個文檔查詢出數據。第二個文檔會作為另一個可選參數(投影)。

根據子文檔查詢

  根據子文檔的欄位值進行查詢時,可用 find( { " 子文檔.子文檔欄位 " :value } ) 方法進行查詢。

  示例:

 1 {
 2     "_id" : ObjectId("5ca86917e8717d2b3f6e21e3"),
 3     "name" : "張三",
 4     "age" : 18,
 5     "father" : {
 6         "name" : "uzi",
 7         "age" : 24
 8     }
 9 }
10 {
11     "_id" : ObjectId("5ca86917e8717d2b3f6e21e4"),
12     "name" : "李四",
13     "age" : 19,
14     "father" : {
15         "name" : "letme",
16         "age" : 25
17     }
18 }
19 {
20     "_id" : ObjectId("5ca86917e8717d2b3f6e21e5"),
21     "name" : "王五",
22     "age" : 20,
23     "father" : {
24         "name" : "zitai",
25         "age" : 26
26     }
27 }
集合中的數據

  

註意欄位值為null

  在文檔中儘量不要將值賦為null,因為進行null查詢時(例如name=null),不僅會返回name值為null的文檔,也會將不包含name欄位的文檔返回。所以應儘量避免使用null值,而應不包含這樣的欄位,這樣就可以使用 $exists運算符進行不包含查詢了。

 

其他數據查找操作

計算文檔數

  查詢集合中的文檔數時,可使用 db.collection_name.count() 進行計算。

  

  若想查詢符合條件的文檔數時,可使用 db.collection_name.find().count() 進行計算。

  

對結果集進行排序

  在MongoDB中對結果集進行排序時,可以用Cursor對象的 sort() 方法。sort() 方法可以按照欄位的值進行升降排序。1 為升序, -1 為降序。

  該方法返回的也是一個Cursor對象,可以繼續使用Cursor對象的其他方法,如limit() 等。

  示例:

db.num.find().sort({a:1})

限制結果集的大小

  在MongoDB中想要限制結果集的數據量,可以調用Cursor對象的 limit() 方法。他可以讓Cursor對象返回指定數量的文檔。

  該方法返回的也是一個Cursor對象,可以繼續使用CUrsor對象的其他方法。

  limit(number) 方法接受一個數字類型參數,即要顯示的文檔數。

db.collection_name.find().limit(number)

限制返回的欄位(投影)

  為了限制文檔檢索時返回的數據量,只獲得有用的信息,拋除無效信息,可以通過find() 方法的第二個可選參數 projection參數。

  在MongdoDB中使用 find() 方法時,預設是顯示文檔中的所有欄位。可以通過給欄位賦 1/true 表示包含,賦 -1/false 表示排除。

  當欄位包含時,只會顯示包含的欄位;當欄位排除時,會顯示出排除外的所有欄位。但是在同一個表達式中,不能同時指定包含和排除。

  示例:

db.student.find({},{name:1})

結果集分頁

  為減少返回的文檔數,可以對結果集進行分頁。跳過部分文檔,直接顯示後面的部分文檔。

  要進行分頁顯示可以用 Cursor對象的 limit() 方法和 skip() 方法。

  skip() 方法可以指定在返迴文檔前跳過多少個文檔。

db.collection_name.find().skip(number).limit(number)

  對數據進行分頁時,可以調用方法 sort() 來確保數據的排列順序不變。

返回某個欄位的值

  在MongoDB中,可以獲取一組文檔中某個欄位的不同值列表。

  Collection對象的 distinct() 方法可以找出指定欄位的不同值列表。這種方法的語法為:

db.collection_name.distinct( key,[query] )
  •    key:指定要獲得值的欄位
  •   query:表示查詢條件。

  示例:


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

-Advertisement-
Play Games
更多相關文章
  • 如果您的孩子不適應編譯型語言怎麼辦? 如果您的孩子貪玩不想花多時間在編程上怎麼辦? 如果您還沒有孩子怎麼辦? 如果您夜晚兼職覺不夠睡又怎麼辦? 不妨試試 “ 拍 簧 片 ”。 媽了巴子的有點麻煩,但別怕,接下來我將用一把梭帶你把這個“場子“搭起來: 使用VSCode搭建“拍簧片”環境: 1、裝VsC ...
  • 項目說明 1. 目前支持WebForm文件下載,後續支持Mvc 2. 支持下載文件加密以及下載限速 3. 項目源碼: "MasterChief.DotNet.Framework.Download" 4. Nuget:Install Package MasterChief.DotNet.Framewo ...
  • 單例模式簡介 單例模式是GOF 23個設計模式中最簡單的模式了,它提供了一種創建唯一對象的最佳實現,註意此處的簡單隻是表述和意圖很簡單,但是實現起來,尤其是實現一個優美的單例模式卻沒有那麼簡單。 單例模式歸根結底就是要確保一個類只有一個實例,並提供一個全局方式來訪問該實例。具體而言,這種模式涉及到一 ...
  • linux 搭建squid代理伺服器 實驗環境: 一臺linux搭建Web伺服器,充當內網web伺服器(同時充當內網客戶端) 202.100.10.100 一臺linux系統充當網關伺服器,兩個網卡,開啟路由轉發 192.168.133.131和202.100.10.1 一臺linux搭建Web服務 ...
  • 在《Linux設備驅動程式》一書中讀到的內核模塊編譯Makefile,不是非常理解,在查詢很多資料後,在這裡做個總結。 書中Makefile代碼: 代碼解析: 1. 判斷變數KERNELRELEASE是否設置,該變數在linux內核頂層Makefile中會被設置。當然第一次執行makefile時,K ...
  • 1.下載npm軟體包 點擊鏈接進入下載頁面:npm下載 2.下載完成後將壓縮包放到家目錄下就可以(也可以放到其他地方) 3.解壓 tar -zxvf 壓縮包名稱,解壓後你會得到一個文件夾,進入後是這樣的。 4.然後我們進入scripts這個目錄。 可以看到這裡有一個文件的名稱叫install.sh. ...
  • 起因: 串口IAP升級在正點原子的常式中有講解,正點原子的方法是:在RAM中開闢一個120K的數據空間,用來存放bin文件,bin文件通過串口一次性發送到單片機,然後再實現程式的跳轉。但是這種方法在實際項目中並不實用,因為沒用文件校驗,不能保證bin文件的完整性,如果貿然跳轉,將會是設備陷入到永遠無 ...
  • redis設計關係資料庫 [toc] 前言 最近需要一張用戶信息表,因為數據量並不大,想先放在記憶體中,等需求變更了,再移到磁碟上,或者往mysql塞,那麼問題來了,怎麼用redis的數據類型設計一個關係資料庫呢。 redis只有key value這種存儲結構,如果想利用它做成想其他資料庫一樣具備 等 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...