整理mongodb文檔:find方法查詢數據

個人博客

整理mongodb文檔:find方法查詢數據
求關注,求批評,求指出,如果哪兒不清晰,請指出來,謝謝

文章概敘

如題,本文講的是如何用find查詢數據,如何在數組、字段、對象中查詢,以及‘或’等查詢操作,最后講了一些參數。依舊是在shell下操作。

數據準備

查詢數據是db操作中很重要的一步,而mongodb又是Nosql的代表。所以,準備了兩條數據,分別是有string,array,number,object的,方便后面的操作以及講解。

[{"string": "str1","num": 1,"obj": { 'name1': 'value1' },"arr": ["arr11", 'arr12']
},
{"string": "str2","num": 2,"obj": { 'name2': 'value2' },"arr": ["arr21", 'arr22']
}]

find

Selects documents in a collection or view and returns a cursor to the
selected documents.

大概意思就是選擇集合或視圖中的文檔,并將光標返回到所選文檔。

首先來個最簡單的用法,直接使用find方法查詢出所有的數據,讓大家有個直觀的了解

db.test.find()

在這里插入圖片描述

數據查詢成功,但是這樣子我們查詢出來的是整個表的數據,實際開發中很少這樣子做。畢竟一個表幾個億的數據是很正常的,而我們再看下文檔中關于find方法的描述

在這里插入圖片描述

看出來,有兩個參數,第一個是我們的查詢條件,第二個是我們的返回字段操作

字段查詢

假定一個例子,我們只需要查詢出num為1的數據,那么我們可以這樣子

db.test.find({ num: 1 })

在這里插入圖片描述

這樣子,我們就查詢出了我們想要的那條數據,而如果存在多條數據的num都為1,我們可以再增加一些查詢的條件,如下:

db.test.find({num: 1,string: 'str1'
})

這樣子的意思,就是查詢string為str1,并且num為1的數據。相當于我們的‘并’查詢,既然有‘并’查詢,那么就有‘或’查詢,假設我們要查詢num為1或則2的數據,我們的查詢條件可以這么寫:

db.test.find({"$or": [{ num: 1 }, { num: 2 }]
})
db.test.find({num: { "$in": [1, 2] }
})

根據字面意思,第一個sql的意思是一個‘或’操作,其中滿足num為1或則2的時候,而第二個sql的意思則是如果num這個字段是在我們的1,2這兩個之間的時候返回,兩者實現的效果是一樣的,但是可以看到or的操作是先把操作符放在外層,然后再將可能的條件列舉出來,而in的操作是具體對某個字段的操作。這兩個的用法需要注意下。

講述完了"$or"的用法,接下里再講解下如果必須加入其他條件以及正則的使用,正則的使用很重要,在我們做sql查詢的時候,我們要匹配數據經常用到。

舉個例子,現在我們還需要string字段為‘1’結尾的,sql應該如下:

db.test.find({string:/1$/,"$or": [{ num: 1 }, { num: 2 }]
})

有正則經驗的朋友可以理解出,/1$/是正則的寫法,意思就是1結尾,上述的sql是滿足string以1結尾,且存在num為1或則num為2的情況。
在這里插入圖片描述

講解完了’ o r ′ 以 及 ′ or'以及' orin’這兩個比較重要的,還有正則的,剩下的是’ l t ′ 、 ′ lt'、' ltgt’等用法,這個建議大家自己按照我的例子去敲一下。官網有很明確的文檔講到這幾個的作用,當然,不大明確的,可以在下面跟我留言。我給個鏈接(最主要希望大家自己學習怎么查找文檔)。

對象查詢

字段的查詢是最簡單的,基本只要用鍵值對的形式查詢就可以,但對于新手來說,對象查詢肯定會一臉懵逼,下面就用一個sql講解如何使用對象查詢

db.test.find({"obj.name1": "value1"
})

在這里插入圖片描述

可以看到,與上面的字段查詢相比,我們將原來的‘string’變成了’obj.name1’,然后就查出了obj中name為value1的那條數據,看…多簡單。

數組查詢

本質上來說,對象跟數組是沒有區別的,因為數組也是對象的一種,一種key為數字,但是被我們"忽略"掉的key,所以我們使用也可以使用

db.test.find({"arr.0": "arr1"
})

這樣子看起來很奇怪,但是能不能查詢出我們剛剛那條數據呢?很明顯,是可以的
在這里插入圖片描述

但是我們實際開發中怎么保證數組的第一個數據(key為0的那條)是arr11呢?所以我們一般會用下面的方法去查詢

db.test.find({"arr": "arr11"
})

在這里插入圖片描述

沒啥好解說的,非要理解,就是遍歷,查看每一條的arr字段,看看是不是數組類型,是的話就看看有沒有arr11這個值這樣子。

字段篩選

講解完了查詢的條件,就輪到了字段的篩選了,舉一個例子,我們只需要返回string這個字段,那么我們可以用下面的sql

db.test.find({ string: "str1" },{ string: 1 }
)

第一個參數我們之前講過了,也就是查詢的條件,這兒的意思是只要string的值為str1的數據。
第二個參數的意思是返回string參數,其中有兩個值,分別是1和0。1代表的是要返回,0代表的是不要返回。
在這里插入圖片描述

這兒可以看到,雖然沒有設置,但是還是返回了_id,畢竟人家是唯一id,比較牛逼,所以有點特權很正常。那么按照上述所說的,我們不想要返回_id,可以設置下面這樣子

db.test.find({ string: "str1" },{ string: 1, "_id": 0 }
)

在這里插入圖片描述

但是呢,部分朋友應該知道一條規則,就是0跟1是不能同時出現的,不然會出現很奇怪的情況,比如(我這兒是在很正經的科普mongodb,請不要想歪)

db.test.find({ string: "str1" },{"obj": 1,string:0}
)

在這里插入圖片描述

意思就是你不能在進來的時候還出去。
除此之外,我們也可以使用下面這種情況

db.test.find({},{"obj.name1": 1,}
)

在這里插入圖片描述

意思就是我只要返回obj對象的name1,這么做原因也很簡單,部分人會將頭像之類圖片轉化為base64,然后將字符串插入到db中,導致返回的數據過多的時候卡死,而這樣做就可以讓我們只拿到想要的數據。

collation

講解完了mongodb的find方法,大家可能發現,我之前一直講的參數collation在這兒好像沒有了,但是collation的重要性又不言而喻,所以mongodb更不可能放棄它,尤其是在find這種最需要它的api中。所以這兒提一嘴如何使用collaion。

db.test.find().collation({ locale: 'simple' })

整理mongodb文檔:collation

cursor

對于游標,我不大想介紹(我后面可能會寫一個關于游標這個設計的博客,本文主要設計的是查詢數據,我不想超過十分鐘)。
大概理解為它是一個指針,就像是linux的軟連接、c的指針,當我們拿到它的時候,它只是一串地址,指向那條我們想要的數據,當我們真正想要操作數據的時候,它會帶我們去到那個文件的地方,是一個很棒的設計。
請記住一點,我們的數據都是在shell中找到的,所以我們返回的都是一個一個游標,具體請看上面所說的

Selects documents in a collection or view and returns a cursor to the
selected documents.

所以我們在代碼中需要加一個toJSON或是toArray來將其轉化,不過,我們更多是使用lean方法。
好消息是lean() 方法可以幫助我們獲得更快的數據獲取速度,因為它能夠將 MongoDB 查詢結果直接轉化為 JavaScript 對象(或 JSON 字符串)而不需要創建 Mongoose 模型實例。

壞消息是lean只能在find方法中使用。

db.test.find().lean()

最后的啰嗦

增刪改查,沒有一個是不重要的,相對于聚合,索引,集群這些,對于新手增刪改查是最重要的。希望大家能好好敲一遍代碼或者看下項目里的代碼!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41431.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自然語言處理技術:NLP句法解析樹與可視化方法

自然語言處理(Natural Language Processing,NLP)句法解析樹是一種表示自然語言句子結構的圖形化方式。它幫助將句子中的每個詞匯和短語按照語法規則連接起來,形成一個樹狀結構,以便更好地理解句子的語法結構和含義。句法解析樹對于理解句子的句法關系、依存關系以及語義角…

Python實現輕量級WEB服務器接收HTTP提交的RFID刷卡信息并回應驅動讀卡器顯示播報語音

本示例使用的設備:RFID網絡WIFI無線TCP/UDP/HTTP可編程二次開發讀卡器POE供電語音-淘寶網 (taobao.com) # -*- coding: utf-8 -*- import time import datetime import socket import threading#將中文信息轉換編碼,顯示文字、TTS語音都需要轉換-------…

從入門到精通Python隧道代理的使用與優化

哈嘍,Python爬蟲小伙伴們!今天我們來聊聊如何從入門到精通地使用和優化Python隧道代理,讓我們的爬蟲程序更加穩定、高效!今天我們將對使用和優化進行一個簡單的梳理,并且會提供相應的代碼示例。 1. 什么是隧道代理&…

SpringCloud Gateway:status: 503 error: Service Unavailable

使用SpringCloud Gateway路由請求時,出現如下錯誤 yml配置如下: 可能的一種原因是:yml配置了gateway.discovery.locator.enabledtrue,此時gateway會使用負載均衡模式路由請求,但是SpringCloud Alibaba刪除了Ribbon的…

無涯教程-Perl - setpwent函數

描述 此功能將枚舉設置(或重置)到密碼條目集的開頭。應該在第一次調用getpwent之前調用此函數。 語法 以下是此函數的簡單語法- setpwent返回值 此函數不返回任何值。 例 以下是顯示其基本用法的示例代碼- #!/usr/bin/perlwhile(($name, $passwd, $uid, $gid, $quota, …

C++寫文件,直接寫入結構體

C寫文件,直接寫入結構體 以前寫文件都是寫入字符串或者二進制再或者就是一些配置文件,今天介紹一下直接寫入結構體,可以在軟件參數較多的時候直接進行讀寫,直接將整個結構體寫入和讀取,看代碼: #include&…

tomcat中的BIO與NIO發展

tomcat中的NIO發展 前言 Tomcat目前支持BIO(阻塞 I/O)、NIO(非阻塞 I/O)、AIO(異步非阻塞式IO,NIO的升級版)、APR(Apache可移植運行庫)模型,本文主要介紹NI…

iceberg系列之 hadoop catalog 小文件合并實戰

背景 flink1.15 hadoop3.0pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…

UBuntu18.04 Qt之雙HDMI屏切換

UBuntu18.04 Qt之雙HDMI接2個4K屏并分別設置分辨率、主屏、副屏 一、設置HDMI-2為主屏 在main函數里面添加&#xff1a; #include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);{long nTotal 0;c…

spring cloud gateway中配置uri

gateway中配置uri配置有三種方式: websocket方式&#xff1a;uri: ws://localhost:9000http方式: uri: http://localhost:8130/lb注冊中心配置方式&#xff08;注冊的服務名稱&#xff09;: uri: lb://monitor-ms gateway的lb方式識別的服務名稱命名規則&#xff1a; "[…

設計模式——適配器模式

引入實例 說起適配器其實在我們的生活中是非常常見的&#xff0c;比如&#xff1a;學校的宿舍的電壓都比較低&#xff0c;而有的學生想使用大功率電器&#xff0c;宿舍的就會跳閘&#xff0c;然而如果你使用一個適配器&#xff08;變壓器&#xff09;就可以使用了&#xff08;…

Jtti:windows虛擬內存最小值太低如何解決

當Windows虛擬內存的最小值設置過低時&#xff0c;可能會導致系統性能下降、應用程序崩潰甚至系統不穩定。解決方法包括&#xff1a; 調整虛擬內存設置&#xff1a; 可以通過以下步驟調整虛擬內存的設置&#xff1a; 右鍵點擊“此電腦”或“計算機”&#xff0c;選擇“屬性”。…

被迫學習一波Linux命令

事情起因 部署一個服務&#xff0c;人家說了最低配置是3G&#xff0c;我沒當回事&#xff0c;拿著個2G的服務器直接就上了&#xff0c;結果&#xff0c;哈哈&#xff0c;都能猜到結果&#xff1a;服務器內存爆了&#xff01;&#xff01;&#xff01;而且最可氣的是服務器還登…

ansible案列之LNMP分布式劇本

LNMP分布式劇本 一&#xff1a;環境設置二&#xff1a;編寫Nginx劇本準備nginx下載源準備配置文件并開放PHP的訪問路徑準備php測試頁面編寫nginx劇本 三&#xff1a;編寫Mysql劇本編寫密碼獲取腳本準備Mysql的yum源編寫mysql劇本 四&#xff1a;準備PHP劇本準備兩個配置文件編寫…

深入理解linux內核--塊設備驅動程序

塊設備的處理 塊設備驅動程序上的每個操作都涉及很多內核組件&#xff1b;其中最重要的一些如圖14-1所示。 例如&#xff0c;我們假設一個進程在某個磁盤文件上發出一個read()系統調用 ——我們將會看到處理write請求本質上采用同樣的方式。 下面是內核對進程請求給予回應的一…

煤礦調度IP語音對講廣播模塊一鍵求助對講礦用調度通信系統SIP語音對講求助終端

硬件接口描述 SV-2101VP/ SV-2103VP系列網絡音頻模塊&#xff0c;所有外部連接采用端子&#xff0c;電源采用2.0mm的端子&#xff0c;網絡采用標準RJ45連接器&#xff0c;其他都是1.25mm的連接器。 端口類型定義 P ———— 電源 AI ———— 模擬輸入&#xff08;在這里是音…

微信小程序前后端開發快速入門(完結篇)

這篇是微信小程序前后端快速入門完結篇了&#xff0c;今天利用之前學習過的所有知識做一個新的項目「群登記助手v1.0」小程序。 整體技術架構&#xff1a;小程序原生前端小程序云開發。 經歷了前面教程的學習&#xff0c;大家有了一定的基礎&#xff0c;所以本次分享重心主要是…

Ubuntu服務器service版本初始化

下載 下載路徑 官網&#xff1a;https://cn.ubuntu.com/ 下載路徑&#xff1a;https://cn.ubuntu.com/download 服務器&#xff1a;https://cn.ubuntu.com/download/server/step1 點擊下載&#xff08;22.04.3&#xff09;&#xff1a;https://cn.ubuntu.com/download/server…

【Python百日進階-Web開發-Peewee】Day271 - Peewee API文檔 - 字段(二)

文章目錄 11.3.17 class UUIDField11.3.18 class BinaryUUIDField11.3.19 class DateTimeField11.3.20 class DateField11.3.21 class TimeField11.3.22 class TimestampField11.3.23 class IPField11.3.24 class BooleanField11.3.25 class BareField11.3.26 class ForeignKey…

神經網絡基礎-神經網絡補充概念-06-計算圖

概念 “計算圖”&#xff08;Computational Graph&#xff09;是一種用于表示數學表達式計算過程的圖結構&#xff0c;廣泛用于深度學習和自動微分等領域。計算圖將復雜的數學表達式分解為一系列簡單的計算節點&#xff0c;這些節點之間通過邊連接&#xff0c;形成了一個有向無…