MongoDB學習記錄(快速入門)

MongoDB核心

基礎概念

數據庫

  • 數據庫是按照數據結構來組織、存儲和管理數據的倉庫。
  • 在內存中運行的,一旦程序運行結束或者計算機斷電,程序運行中的數據都會丟失。
  • 我們需要將一些程序運行的數據持久化到硬盤之中,以確保數據的安全性。
  • 數據庫就是數據持久化的最佳選擇。數據庫就是存儲數據的倉庫。

數據庫分類

關系型數據庫:

  • MySQL、Oracle、DB2、SQL Server ······
  • 關系型數據庫中全是表

非關系型數據庫:

  • ?MongoDB、 Redis ······
  • 鍵值對數據庫

MongoDB

  • MongoDB 是一個基于分布式文件存儲的數據庫.
  • MongoDB 是為快速開發互聯網 Web 應用而設計的數據庫系統。
  • MongoDB 的設計目標是極簡、靈活、作為Web 應用棧的一部分。
  • MongoDB 的數據模型是面向文檔的,所謂文檔是一種類似于 JSON 的結構,簡單理解
    MongoDB 這個數據庫中存的是各種各樣的JSON. (BSON)

在MongoDB中有三個重要概念:

  1. 數據庫 (database):
    數據庫是一個數據倉庫,數據庫服務下可以創建多個數據庫,數居庫中可以存放多個集合
  2. 集合 (collection):
    集合類似于 JS 中的數組,在集合中可以存放很多文檔
  3. 文檔 (document)
    文檔是數據庫中的最小單位,類似于 JS 中的對象

與JSON來對比:

  • JSON文件==>數據庫
  • JSON中的一級數組==>集合
  • 數組中的對象==>文檔?

MongoDB Shell

MongoDB Shell 是 MongoDB 提供的官方交互式界面,允許用戶與 MongoDB 數據庫進行交互、執行命令和操作數據庫。

MongoDB Shell 是基于 JavaScript 的,允許用戶直接在命令行或者腳本中使用 JavaScript 語言來操作 MongoDB 數據庫。

安裝完成后,可以來使用 MongoDB Shell 連接到 MongoDB 數據庫并執行操作。

數據庫命令

1.顯示所有數據庫

    show dbs

2.?切換到指定的數據庫

    use 數據庫名

注:如果數據庫不存在會自動創建數據庫。如果數據庫內沒有集合,show dbs指令不會顯示該數據庫

3.顯示當前所在的數據庫

    db

4.?刪除當前數據庫

    use 庫名db.dropDatabase ()

集合命令

1.?創建集合

    db.createCollection (' 集合名稱 ')

2.顯示當前數據庫中的所有集合

    show collections

3.刪除某個集合

    db. 集合名.drop

4.重命名集合

    db.集合名.renameCollection('newName')

文檔命令

1.插入文檔

    db. 集合名.insert (文檔對象)

2.查詢文檔

    db. 集合名.find (查詢條件)例:db.test.find({name:'張三'})

注:查詢后結果中,_id 是 mongodb 自動生成的唯一編號,用來唯一標識文檔

3. 更新文檔

    db. 集合名.update (查詢條件,新的文檔)例:db. test.update ({name: 張三 '},{$set:{age:19}})

注:如果新文檔不使用$set則會覆蓋舊文檔?

4.刪除文檔

    db. 集合名.remove (查詢條件)

Mongoose

Mongoose簡介

Mongoose (http://www.mongoosejs.net)是一個對象文檔模型庫

可以讓我們使用代碼來進行操作 mongodb 數據庫

使用方法

連接數據庫

首先需要安裝Mongoose

    npm i mongoose
//導入mongoose
const mongoose = require('mongoose');//連接數據庫  mongodb://ip:端口/數據庫名
mongoose.connect('mongodb://127.0.0.1:27017/test')//設置回調函數
//連接成功回調
mongoose.connection.once('open', () => {console.log('數據庫連接成功')
})//連接失敗回調
mongoose.connection.once('err', () => {console.log('數據庫調用失敗');
})//連接關閉回調
mongoose.connection.once('close', () => {console.log('數據庫連接關閉');
})//開啟定時器,關閉鏈接
setTimeout(() => {mongoose.disconnect()
}, 3000)

創建文檔結構對象和文檔模型對象

//導入mongoose
const mongoose = require('mongoose')//鏈接數據庫
mongoose.connect('mongodb://127.0.0.1:27017/dome')//創建文檔結構對象
//該對象用于規定文檔結構
let gameSchema = new mongoose.Schema({name: String,price: Number
})//創建文檔模型對象
//該對象內封裝方法,用于操作數據庫
//傳參(集合名,文檔結構對象)
let gameModel = mongoose.model('games', gameSchema)//設置鏈接成功后的回調
mongoose.connection.once('open', () => {console.log('數據庫連接成功');testDocumentation() //調用封裝好的方法進行增刪改查
})

字段值驗證

?Mongoose 有一些內建驗證器,可以對字段值進行驗證

字段值驗證在創建文檔結構對象時進行

let personSchema = new mongoose.Schema({name: {type: String,required: true //必填項},age: {type: Number,default: 18 //默認值},sex: {type: String,enum: ['男', '女'] //枚舉值,設置的值必須是數組中的},card: {type: Number,unique: true //唯一值,新建集合才有效果}
})

添加文檔(增)

添加文檔,可以使用文檔模型對象中的create方法來添加,批量添加可以使用insertMany方法

添加一條時,傳入參數為符合文檔結構對象的對象

async function AddDocumentation() {//添加文檔//使用文檔模型對象中的create方法try {let add = await gameModel.create({name: '艾爾登法環',price: 298})console.log(add);} catch (error) {console.log(error);}//關閉數據庫mongoose.disconnect()
}

添加多條,傳入數組,數組內為符合文檔結構對象的對象

//增加多條
async function AddDocumentationMany() {try {let add = await gameModel.insertMany([{name: '無限機兵',price: 159},{name: '匹諾曹',price: 298}])console.log(add);} catch (err) {console.log(err);}//關閉數據庫mongoose.disconnect()
}

注:Mongoose 6.x 版本之后的 API 變更。從 Mongoose 6 開始,所有的異步操作(如?Model.create()find()save()?等)都不再支持回調函數,而是強制使用 Promise 或?async/await?語法。

控制臺輸出:

刪除文檔(刪)

刪除使用?deleteOne方法和deleteMany方法。

傳入一個查詢參數即可

deleteOne為單獨刪除

async function DeleteDocumentOne() {try {let Delete = await gameModel.deleteOne({_id: '68522ffc56b9a48fd708b8fc'})console.log(Delete);} catch (err) {console.log(err);}mongoose.disconnect()
}

deleteMany為批量刪除

async function DeleteDocumentMany() {try {let Delete = await gameModel.deleteMany({name: '黑暗之魂1'})console.log(Delete);} catch (err) {console.log(err);}mongoose.disconnect()
}

?控制臺輸出:

?

更新文檔(改)

更新使用?updateOne方法和updateMany方法。

需要傳入兩個參數,第一個為查詢參數,第二個為更新參數

該方法是直接在舊文檔進行修改,不存在新文檔覆蓋舊文檔,故不用$set

updateOne為單獨更新

async function UpdateDocumentOne() {try {let update = await gameModel.updateOne({ _id: '68523020764ff87f3b7cabbd' },{ name: '魂5' })console.log(update);} catch (err) {console.log(err);}mongoose.disconnect()
}

updateMany為批量更新

async function UpdateDocumentMany() {try {let update = await gameModel.updateMany({ name: '黑暗之魂3' },{ price: 99 })console.log(update);} catch (err) {console.log(err);}mongoose.disconnect()
}

?控制臺輸出:?

?

?查詢文檔(查)

查詢分為單獨查詢,ID查詢和批量查詢

分別使用 findOne ( ) , findById ( ) ,?find ( ) 方法

單獨查詢需要傳入查詢參數,ID查詢需要傳入ID,批量查詢傳不傳參數都可以

批量查詢若不傳參,則為查詢全部數據

單獨查詢:

//查詢一條數據
async function FindDocumentOne() {try {let find = await gameModel.findOne({ name: '無限機兵' })console.log(find);} catch (err) {console.log(err);}
}

ID查詢:

//通過ID查詢
async function FindDocumentID() {try {let find = await gameModel.findById('6852817f3870d51a37a2df25')console.log(find);} catch (err) {console.log(err);}
}

批量查詢:

//批量查詢
async function FindDocumentMany() {try {let find = await gameModel.find({ name: '魂5' })console.log(find);} catch (err) {console.log(err);}
}

控制臺輸出:

?條件控制

在查詢文檔時,我們可以設置查詢的條件,來獲取我們想要的數據

運算符

在mongodb中不可以使用 >? <? = 等運算符,需要使用相應的符號來替換

運算符代替符號
>$gt
<$lt
>=$gte
<=$lte
!==$ne

使用語法:

{ 屬性名: { 運算符: 值 } }示例:
let find01 = await gameModel.find({ price: { $lt: 200 } })

?邏輯運算

運算符邏輯
$or邏輯或
$and邏輯與

使用語法:

{ 運算符: [{ 屬性名: 值 }, { 屬性名: 值 }
] }示例:
let find02 = await gameModel.find({ $or: [{ price: 298 }, { price: 99 }] })
混合用法:
let find03 = await gameModel.find({ $or: [{ price: { $lt: 300 } }, { price: { $gt: 100 } }] })

正則匹配

條件中可以直接使用正則匹配

let find04 = await gameModel.find({ name:/魂/ })let find04 = await gameModel.find({ name: new RegExp('魂') })

個性化讀取

字段篩選

在讀取完文檔后,對象中的一部分數據并不一定是我們所需要的

可以通過字段篩選來獲取我們想要的屬性

語法:

文檔模型對象 . find ( ) . select ( {? 屬性名 : 0 , 屬性名: 1?} )

0:不要的字段? ? 1:要的字段

//批量查詢
async function FindDocumentMany() {try {let find01 = await gameModel.find().select({ _id: 0, name: 1, price: 1 })console.log(find01);} catch (err) {console.log(err);}mongoose.disconnect()
}

數據排序?

根據規定屬性值排序

語法:

文檔模型對象 . find ( ) . sort( {? 屬性名 : 0 / 1??} )

0:倒序? 1:正序

//批量查詢
async function FindDocumentMany() {try {let find01 = await gameModel.find().select({ _id: 0, name: 1, price: 1 }).sort({ price: 1 })console.log(find01);} catch (err) {console.log(err);}mongoose.disconnect()
}

數據截取

從指定位置獲取到指定數量的數據

語法:

文檔模型對象 . find ( ) . skip( 數字 )? //跳過幾個數據

文檔模型對象 . find ( ) . limit( 數字 )? ?//獲取幾個數據

//批量查詢
async function FindDocumentMany() {try {let find01 = await gameModel.find().select({ _id: 0, name: 1, price: 1 }).sort({ price: 1 }).skip(2).limit(3)console.log(find01);} catch (err) {console.log(err);}mongoose.disconnect()
}

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

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

相關文章

阿里一面:微服務拆分需要考慮什么因素?

要拆分微服務&#xff0c;首先我們要了解微服務拆了會有什么問題&#xff1f;怎么合理拆服務&#xff1f; 拆分服務會帶來什么問題&#xff1f; 舉個電商系統下單扣庫存的例子。 對于單體應用&#xff0c;通訊在進程內部進行&#xff0c;下單方法調用扣庫存方法&#xff0c;…

3D高斯潑濺和4D高斯

1.高斯函數 想象你往平靜的湖水里扔一塊石頭&#xff0c;水波會以石頭落點為中心向外擴散&#xff0c;形成一個逐漸衰減的圓形波紋。高斯函數的形狀就和這個波紋類似&#xff1a; 中心最高&#xff08;石頭落點&#xff0c;波峰最強&#xff09;。越往外&#xff0c;高度&…

comfyui插件和comfyui mac安裝

mac comfyui安裝包 ComfyUI.zip&#xff0c;官方最新0.3.40&#xff0c;如果后續官方有迭代&#xff0c;可以直接通過git更新源碼升級 comfyui插件下載&#xff0c;解壓放到custom_nodes目錄下&#xff0c;包含 comfyui-animatediff-evolved&#xff08;視頻插件&#xff09; 和…

面試題SpringCloud

SpringCloud有哪些特征&#xff1f; 分布式/版本化配置服務注冊與發現路由服務到服務的調用負載均衡斷路器領導選舉和集群狀態分布式消息傳遞 SpringCloud核心組件&#xff1f; Eureka 注冊中心Ribbon 客戶端負載均衡Hystrix&#xff1a; 服務容錯處理Feign:聲明式Rest客戶端Zu…

ASR-PRO語音識別可能出現的問題

ASR-PRO語音識別可能出現的問題 4月份有一天刷到牢大/愛麗絲語音自開關燈設備&#xff0c;心血來潮&#xff0c;博主也是淺嘗了一下&#xff0c;由此也總結一下&#xff0c;實現此項目會出現的問題。 在實現愛麗絲開關燈模塊時ASRPRO語音識別可能出現的問題如下&#xff1a; …

蒼穹外賣--緩存菜品Spring Cache

Spring Cache是一個框架&#xff0c;實現了基于注解的緩存功能&#xff0c;只需要簡單地加一個注解&#xff0c;就能實現緩存功能。 Spring Cache提供了一層抽象&#xff0c;底層可以切換不同的緩存實現&#xff0c;例如&#xff1a; ①EHCache ②Caffeine ③Redis 常用注解…

個人簡歷制作MarkDown模板

MarkDown制作個人簡歷的模板放在了github上&#xff0c;大家如有需求&#xff0c;請自取&#xff1a; https://github.com/QQQQQQBY/ResumeTemplate 介紹一下此模板的特點&#xff1a; &#x1f338;個人面試期間使用的、整理的簡歷格式&#xff0c;現在分享給大家。 ?簡歷采…

【MySQL數據庫 | 第五篇】DDL操作2

文章目錄 當前數據庫student的數據數據表操作 - 修改&刪除&#x1f4d6;修改操作增加字段&#x1f44f;案例&#xff1a;向數據表student中添加字段 id修改字段的數據類型【只能修改字段的屬性】&#x1f44f;案例&#xff1a;將student表中字段age的屬性由tinyint unsigne…

【瀏覽器插件】如何開發一個Chrome瀏覽器插件

這篇文章來介紹一下,如何開發一個自己的Chrome瀏覽器插件程序。 Chrome瀏覽器插件,其實是讓瀏覽器替我們執行我們自己寫的代碼,既然要讓瀏覽器執行代碼,那么首先,就需要定義一個規范,也就是說,需要讓Chrome瀏覽器知道,你寫的程序是一個插件。 這就需要介紹一下插件中…

詳細講解Redis為什么被設計成單線程

Redis 被設計成單線程的原因主要有以下幾點&#xff0c;這些原因涉及性能優化、復雜性控制、數據一致性以及適用場景等多個方面&#xff1a; 1. 簡化設計與實現 避免鎖競爭&#xff1a;多線程環境下&#xff0c;多個線程訪問共享資源時需要加鎖來保證數據一致性。鎖的使用會增…

Hive 邏輯優化器

Optimizer PointLookupOptimizer 作用&#xff1a;把符合條件的 OR 表達式轉為 IN。 參數hive.optimize.point.lookup 設置是否開啟 PointLookupOptimizer&#xff0c;默認為 true. 參數 hive.optimize.point.lookup.min 控制多少個 OR 表達式轉為 IN&#xff0c;默認 31。 例…

ZYNQ Petalinux實戰:PCIe直通NVMe固態硬盤,解鎖存儲性能新極限!

突破SD卡和SATA的速度枷鎖!本文將手把手教你如何在ZYNQ平臺上通過PCIe接口驅動NVMe固態硬盤。從硬件設計、Linux內核配置到創新性的DMA零拷貝優化,實現2000MB/s+ 的存儲性能飛躍,附完整代碼解析和性能實測對比。 一、為什么選擇PCIe NVMe?存儲性能革命 ZYNQ傳統存儲方案面…

05-mcp-server案例分享-用豆包大模型 1.6 手搓文生圖視頻 MCP-server發布到PyPI官網

1前言 上期給大家介紹過mcp-server案例分享-用豆包大模型 1.6 手搓文生圖視頻 MCP-server。當時部署的方式使用了一個私有云SSE的部署。當時缺少一個本地部署的方式&#xff0c;有的小伙伴給我留言能不能有一個本地話部署方式了。今天就給大家帶來一個本地化部署的方案。 話不…

MCP Parameters 增加描述

場景&#xff1a;本地MCP開發完后是否發現CLINE上顯示的Parameters 顯示No description 方法1 &#xff1a;使用參數元數據 (Annotated) 可以使用 Pydantic 的with 類提供有關參數的其他元數據Annotated。這種方法更受歡迎&#xff0c;因為它更現代&#xff0c;并且將類型提示…

STM32 GPIO 寄存器開發

&#x1f527; ?一、核心寄存器概覽? ?寄存器??功能??位寬??關鍵位域??GPIOx_CRL/CRH?配置引腳模式&#xff08;輸入/輸出/復用/模擬&#xff09;和輸出參數32位每4位控制1個引腳&#xff1a;CNF[1:0]&#xff08;模式&#xff09; MODE[1:0]&#xff08;速度&am…

powershell 獲取 用戶及進程列表

在PowerShell中獲取用戶的進程列表&#xff0c;可以通過幾種方法實現。以下是一些常見的方法&#xff1a; 方法1&#xff1a;使用Get-WmiObject Get-WmiObject命令可以用來查詢Windows Management Instrumentation (WMI)數據庫&#xff0c;從而獲取關于進程和用戶的信息。 # …

量化面試綠皮書:15. 假幣一

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 15. 假幣一 有 10個袋子&#xff0c;每個袋子里有 100個相同的硬幣。 在除一個以外的所有袋子中&#xff0c;每枚硬幣重10 克。 然而&#x…

Java求職者面試:Spring AI、MCP、RAG、向量數據庫與Embedding模型技術解析

Java求職者面試&#xff1a;Spring AI、MCP、RAG、向量數據庫與Embedding模型技術解析 第一輪&#xff1a;基礎概念問題 1. 請解釋Spring AI是什么&#xff1f;它與傳統Spring框架有何不同&#xff1f; Spring AI是Spring生態系統的一部分&#xff0c;專注于人工智能和機器學…

tp框架導出excel的時候報錯:unexcepted identifier “Closure“,excepting variable

記錄一個簡單的錯誤。 背景 用的是PhpOffice/PhpSpreadsheet 在本地環境下是可以正常導出excel的。但是線上就不行。 就會報錯unexcepted identifier “Closure”&#xff0c;好像是不能用匿名函數。 首先 本地可以正常導出&#xff0c;然后服務器上不可以。看了各種日志。ph…

[Java惡補day24] 74. 搜索二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣&#xff1a; 每行中的整數從左到右按非嚴格遞增順序排列。 每行的第一個整數大于前一行的最后一個整數。 給你一個整數 target &#xff0c;如果 target 在矩陣中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 …