MongoDB學習和應用(高效的非關系型數據庫)

一丶 MongoDB簡介

對于社交類軟件的功能,我們需要對它的功能特點進行分析:

  • 數據量會隨著用戶數增大而增大
  • 讀多寫少
  • 價值較低
  • 非好友看不到其動態信息
  • 地理位置的查詢

針對以上特點進行分析各大存儲工具:

  • mysql:關系型數據庫(效率低)
  • reids: redis緩存(微博,效率高,數據格式不豐富)
  • 對于大量數據而言,顯然不能使用關系型數據庫進行存儲,我們需要通過MongoDB進行存儲
  • 對于讀多寫少的應用我們需要減少讀取成本,比如說:一條SQL語句,單表查詢一定比多表查詢更快

針對社交app,一般采用一下存儲策略:

  • mongodb:存儲業務數據(圈子,推薦的數據,小視頻數據,點贊,評論等)
  • redis:承擔的角色是緩存層(提升查詢效率)
  • mysql:存儲和核心業務數據,賬戶

而對于mongoDB

  • MongoDB是一個高效的非關系型數據庫(不支持表關系:只能操作單表)
  • MongoDB是一個基于分布式文件存儲的數據庫,由C++語言編寫,旨在為WEB應用提供可擴展性高性能數據存儲解決方案
  • MongoDB是一個介于關系型數據庫和非關系型數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的,它支持的數據結構非常松散,是類似json的bson格式,因此可以存儲比較復雜的數據類型。
  • MongoDB最大的特點是它支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
  • 官網: 添加鏈接描述

二丶MongoDB的特點

MongoDB 最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。它是一個面向集合的,模式自由的文檔型數據庫。具體特點總結如下:

  1. 面向集合存儲,易于存儲對象型數據
  2. 模式自由
  3. 支持動態查詢
  4. 支持完全索引,包含內部對象
  5. 支持復制和故障恢復
  6. 使用高效的二進制數據存儲,包括大型對象(如視頻等)
  7. 自動處理碎片,以支持云計算層次的擴展性
  8. 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程 序, 社區中也提供了對Erlang及.NET 等平臺的驅動程序
  9. 文件存儲格式為 BSON(一種 JSON 的擴展)

2.1通過docker 安裝MongoDB

拉取mongodb的鏡像,也可以通過docker-compose啟動,更方便:
在這里插入圖片描述

docker-compose up -d
#查看容器
docker ps -a

在這里插入圖片描述

2.2 MongoDB體系結構

MongoDB的羅杰結構是一種層次結構,主要由文檔(document),集合(collection),數據庫(databases)三部分組成,邏輯結構是,面向用戶的,用戶使用MongoDB開發應用程序就是使用這樣結構:

  1. MongoDB 的文檔(document),相當于關系數據庫中的一行記錄。
  2. 多個文檔組成一個集合(collection),相當于關系數據庫的表
  3. 多個集合(collection),邏輯上組織在一起,就是數據庫
  4. 應該MongoDB示例支持多個數據庫database.文檔document,集合collection
    類似這樣:在這里插入圖片描述
    為了更好的理解,可以與SQL中的概念進行對比
SQL術語/概念MongoDB術語/概念解釋/說明
databasedatabase數據庫
tablecollection數據庫表/集合
rowdocument表中的一條數據
columnfield數據字段/域
indexindex索引
table joins表連接,MongoDB不支持
primary keyprimary key主鍵,MongoDB自動將_id字段設置為主鍵

2.3 數據類型

  • 數據格式:BSON{aa:bb}
  • null:用于表示空值或者不存在的字段,{“x”:null}
  • 布爾型:布爾類型有兩個值true和false,{“x”:true}
  • 數值,shell默認使用64位浮點型數值。{“x”:3.14}或{“x”:3}。對于整型值,可以使用 NumberInt(4字節符號整數)或NumberLong(8字節符號整數), {“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
  • 字符串:UTF-8字符串都可以表示為字符串類型的數據{“x”:“你好”}
  • 日期:日期被存儲為自新紀元依賴經過的毫秒數,不存儲時區,{“x”:new Date()}
  • 正則表達式:查詢時,使用正則表達式作為限定條件,語法與JavaScript的正則表達式相同{“x”😕[abc]/}
  • 數組:數據列表或數據集可以表示為數組,{“x”: [“a“,“b”,”c”]}
  • 內嵌文檔:文檔可以嵌套其他文檔,被嵌套的文檔作為值來處理,{“x”:{“y”:3 }}
  • 對象Id:對象id是一個12字節的字符串,是文檔的唯一標識,{“x”: objectId() }
  • 二進制數據:二進制數據是一個任意字節的字符串。它不能直接在shell中使用。如果要 將非utf-字符保存到數據庫中,二進制數據是唯一的方式。

三丶MongoDB入門

3.1 數據庫以及表操作

#查看所有的數據庫
> show dbs#通過use關鍵字切換數據庫
> use admin#創建數據庫
#說明:在MongoDB中,數據庫是自動創建的,通過use切換到新數據庫中,進行插入數據即可自動創建數據庫
> use testdb> show dbs #并沒有創建數據庫> db.user.insert({id:1,name:'zhangsan'})  #插入數據> show dbs#查看表
> show tables> show collections#刪除集合(表)
> db.user.drop()
true  #如果成功刪除選定集合,則 drop() 方法返回 true,否則返回 false。#刪除數據庫
> use testdb #先切換到要刪除的數據中> db.dropDatabase()  #刪除數據庫

3.2 新增數據

在MongoDB中,存儲的文檔結構是一種類似于json的結構,稱之為bson(全稱為:Binary JSON)。

#插入數據
#語法:db.表名.insert(json字符串)> db.user.insert({id:1,username:'zhangsan',age:20})> db.user.find()  #查詢數據

3.3 更新數據

update() 方法用于更新已存在的文檔。語法格式如下:

db.collection.update(<query>,<update>,[upsert: <boolean>,multi: <boolean>,writeConcern: <document>]
)

參數說明:

  • query : update的查詢條件,類似sql update查詢內where后面的。
  • update : update的對象和一些更新的操作符(如 , , ,inc.$set)等,也可以理解為sql update查詢內set后面的
  • upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
  • multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
  • writeConcern :可選,拋出異常的級別。
#查詢全部
> db.user.find()#更新數據
> db.user.update({id:1},{$set:{age:22}}) #注意:如果這樣寫,會刪除掉其他的字段
> db.user.update({id:1},{age:25})#更新不存在的字段,會新增字段
> db.user.update({id:2},{$set:{sex:1}}) #更新數據#更新不存在的數據,默認不會新增數據
> db.user.update({id:3},{$set:{sex:1}})#如果設置第一個參數為true,就是新增數據
> db.user.update({id:3},{$set:{sex:1}},true)

3.4 刪除數據

通過remove()方法進行刪除數據,語法如下:

db.collection.remove(<query>,{justOne: <boolean>,writeConcern: <document>}
)

參數說明:

  • query :(可選)刪除的文檔的條件。
  • justOne : (可選)如果設為 true 或 1,則只刪除一個文檔,如果不設置該參數,或使用默認值 false,則刪除所有匹配條件的文檔。
  • writeConcern :(可選)拋出異常的級別。

實例:

#刪除數據
> db.user.remove({})#插入4條測試數據
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})> db.user.remove({age:22},true)#刪除所有數據
> db.user.remove({})

3.5 查詢數據

MongoDB 查詢數據的語法格式如下:

db.user.find([query],[fields])
  • query :可選,使用查詢操作符指定查詢條件
  • fields :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。

條件查詢:

操作格式范例RDBMS中的類似語句
等于{<key>:<value>}db.col.find({"by":"黑馬程序員"}).pretty()where by = '黑馬程序員'
小于{<key>:{$lt:<value>}}db.col.find({"likes":{$lt:50}}).pretty()where likes < 50
小于或等于{<key>:{$lte:<value>}}db.col.find({"likes":{$lte:50}}).pretty()where likes <= 50
大于{<key>:{$gt:<value>}}db.col.find({"likes":{$gt:50}}).pretty()where likes > 50
大于或等于{<key>:{$gte:<value>}}db.col.find({"likes":{$gte:50}}).pretty()where likes >= 50
不等于{<key>:{$ne:<value>}}db.col.find({"likes":{$ne:50}}).pretty()where likes != 50

實例:

#插入測試數據
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})db.user.find()  #查詢全部數據
db.user.find({},{id:1,username:1})  #只查詢id與username字段
db.user.find().count()  #查詢數據條數
db.user.find({id:1}) #查詢id為1的數據
db.user.find({age:{$lte:21}}) #查詢小于等于21的數據
db.user.find({$or:[{id:1},{id:2}]}) #查詢id=1 or id=2#分頁查詢:Skip()跳過幾條,limit()查詢條數
db.user.find().limit(2).skip(1)  #跳過1條數據,查詢2條數據
db.user.find().sort({id:-1}) #按照id倒序排序,-1為倒序,1為正序

3.6 索引

索引通常能夠極大的提高查詢的效率,如果沒有索引MongoDB在讀取數據時必須草棉集合中的每個文件選取那些符合查詢條件的記錄
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命的。
索引是特殊的數據結構,索引存儲在一個易于遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構

#創建索引
> db.user.createIndex({'age':1})#查看索引
> db.user.getIndexes()
[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "testdb.user"}
]
#說明:1表示升序創建索引,-1表示降序創建索引。

3.7 執行計劃

MongoDB查詢分析可以確保我們建議的索引有效,是查詢語句性能分析的重要工具

#插入1000條數據
for(var i=1;i<1000;i++)db.user.insert({id:100+i,username:'name_'+i,age:10+i})#查看執行計劃
> db.user.find({age:{$gt:100},id:{$lt:200}}).explain()#測試沒有使用索引
> db.user.find({username:'zhangsan'}).explain()#winningPlan:最佳執行計劃
#"stage" : "FETCH", #查詢方式,常見的有COLLSCAN/全表掃描、IXSCAN/索引掃描、FETCH/根據索引去檢索文檔、SHARD_MERGE/合并分片結果、IDHACK/針對_id進行查詢

四丶SpringData-Mongo

Spring-data對MongoDB做了支持,使用spring-data-mongodb可以簡化MongoDB的操作,封裝了底層的mongodb-driver。

地址:https://spring.io/projects/spring-data-mongodb

使用Spring-Data-MongoDB很簡單,只需要如下幾步即可:

  • 導入起步依賴
  • 編寫配置信息
  • 編寫實體類(配置注解 @Document,@Id)
  • 操作mongodb
    • 注入MongoTemplate對象,完成CRUD操作
    • 編寫Repository接口,注入接口完成基本Crud操作

4.1、環境搭建

第一步,導入依賴:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version>
</parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

第二步,編寫application.yml配置文件

spring:data:mongodb:uri: mongodb://192.168.136.160:27017/test

第三步,編寫啟動類

package com.tanhua.mongo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MongoApplication {public static void main(String[] args) {SpringApplication.run(MongoApplication.class, args);}
}

4.2、完成基本操作

第一步,編寫實體類

package com.tanhua.mongo.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.Document;@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(value="person")
public class Person {private ObjectId id;private String name;private int age;private String address;}

第二步,通過MongoTemplate完成CRUD操作

package cn.itcast.mongo.test;import cn.itcast.mongo.MongoApplication;
import cn.itcast.mongo.domain.Person;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest(classes = MongoApplication.class)
public class MongoTest {/*** SpringData-mongodb操作*    1、配置實體類*    2、實體類上配置注解(配置集合和對象間的映射關系)*    3、注入MongoTemplate對象*    4、調用對象方法,完成數據庫操作*/@Autowiredprivate MongoTemplate mongoTemplate;//保存@Testpublic void testSave() {for (int i = 0; i < 10; i++) {Person person = new Person();person.setId(ObjectId.get()); //ObjectId.get():獲取一個唯一主鍵字符串person.setName("張三"+i);person.setAddress("北京順義"+i);person.setAge(18+i);mongoTemplate.save(person);}}//查詢-查詢所有@Testpublic void testFindAll() {List<Person> list = mongoTemplate.findAll(Person.class);for (Person person : list) {System.out.println(person);}}@Testpublic void testFind() {//查詢年齡小于20的所有人Query query = new Query(Criteria.where("age").lt(20)); //查詢條件對象//查詢List<Person> list = mongoTemplate.find(query, Person.class);for (Person person : list) {System.out.println(person);}}/*** 分頁查詢*/@Testpublic void testPage() {Criteria criteria = Criteria.where("age").lt(30);//1、查詢總數Query queryCount = new Query(criteria);long count = mongoTemplate.count(queryCount, Person.class);System.out.println(count);//2、查詢當前頁的數據列表, 查詢第二頁,每頁查詢2條Query queryLimit = new Query(criteria).limit(2)//設置每頁查詢條數.skip(2) ; //開啟查詢的條數 (page-1)*sizeList<Person> list = mongoTemplate.find(queryLimit, Person.class);for (Person person : list) {System.out.println(person);}}/*** 更新:*    根據id,更新年齡*/@Testpublic void testUpdate() {//1、條件Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));//2、更新的數據Update update = new Update();update.set("age", 20);mongoTemplate.updateFirst(query, update, Person.class);}@Testpublic void testRemove() {Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));mongoTemplate.remove(query, Person.class);}
}

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

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

相關文章

Qt學習及使用_第1部分_認識Qt---Qt簡介

前言 學以致用,通過QT框架的學習,一邊實踐,一邊探索編程的方方面面. 參考書:<Qt 6 C開發指南>(以下稱"本書") 標識說明:概念用粗體傾斜.重點內容用(加粗黑體)---重點內容(紅字)---重點內容(加粗紅字), 本書原話內容用深藍色標識,比較重要的內容用加粗傾斜下劃線…

Python語法基礎篇(包含類型轉換、拷貝、可變對象/不可變對象,函數,拆包,異常,模塊,閉包,裝飾器)

Python語法基礎篇&#xff08;二&#xff09; 類型轉換拷貝可變對象與不可變對象可變對象不可變對象 函數拆包異常模塊閉包裝飾器 &#x1f439;&#x1f439;&#x1f439;&#x1f439;&#x1f439;一只正在努力學習計算機技術的小倉鼠&#xff0c;尾部有課程鏈接哦~&#x…

錄制mp4

目錄 單線程保存mp4 多線程保存mp4 rtsp ffmpeg錄制mp4 單線程保存mp4 import cv2 import imageiocv2.namedWindow(photo, 0) # 0窗口大小可以任意拖動&#xff0c;1自適應 cv2.resizeWindow(photo, 1280, 720) url "rtsp://admin:aa123456192.168.1.64/h264/ch1/main…

ISBN書號查詢接口如何用PHP實現調用?

一、什么是ISBN書號查詢接口 ISBN數據查詢接口是一項圖書信息查詢服務。它基于全球通用的ISBN編碼系統&#xff0c;幫助用戶快速獲取圖書的詳細信息&#xff0c;包括書名、作者、出版社、出版時間、價格、封面等關鍵字段。 該接口廣泛應用于電商平臺、圖書館管理系統、二手書…

Redis底層數據結構之深入理解跳表(2)

上一篇文章中我們詳細講述了跳表的增添、查找和修改的操作&#xff0c;這篇文章我們來講解一下跳表在多線程并發時的安全問題。在Redis中&#xff0c;除了網絡IO部分和大文件的后臺復制涉及到多線程外&#xff0c;其余任務執行時全部都是單線程&#xff0c;這也就意味著在Redis…

Go語言依賴管理與版本控制-《Go語言實戰指南》

在現代軟件開發中&#xff0c;項目的第三方依賴和版本控制扮演著至關重要的角色。Go 語言自 Go 1.11 引入 Modules&#xff08;模塊化管理&#xff09;以來&#xff0c;已經實現了內建的依賴管理機制&#xff0c;徹底擺脫了傳統 GOPATH 模式的限制。 本章將深入探討如何使用 Go…

Appium+python自動化(十一)- 元素定位- 下

1、 List定位 List顧名思義就是一個列表&#xff0c;在python里面也有list這一個說法&#xff0c;如果你不是很理解什么是list&#xff0c;這里暫且理解為一個數組或者說一個集合。首先一個list是一個集合&#xff0c;那么他的個數也就成了不確定性&#xff0c;所以這里需要用復…

stress 服務器壓力測試的工具學習

一、stress 工具介紹 tress 是一種工具&#xff0c;可以對符合 POSIX 標準的操作系統施加可配置數量的 CPU、內存、I/O 或磁盤壓力&#xff0c;并報告其檢測到的任何錯誤。 stress 不是一個基準測試。它是由系統管理員用來評估其系統擴展性的工具&#xff0c;由內核程序員用來…

不止抓請求:5種開發場景中的抓包組合策略(含 Charles 等工具)

很多開發者用抓包&#xff0c;只在“接口調不通”的時候。 但在復雜項目中&#xff0c;抓包早已不僅是調錯工具&#xff0c;更是開發節奏提速器、協作問題解耦器、架構瓶頸探測器。 關鍵在于——不同場景下&#xff0c;你要用對方法、配對工具。 以下是我根據日常開發實戰&a…

藍橋杯3498 01串的熵

問題描述 對于一個長度為 23333333的 01 串, 如果其信息熵為 11625907.5798&#xff0c; 且 0 出現次數比 1 少, 那么這個 01 串中 0 出現了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚舉 0 出現的次數//因…

計算機系統大作業——程序人生

計算機系統 大作業 題 目 程序人生-Hello’s P2P 專 業 物聯網工程 學   號 2022112820 班 級 2237301 學 生 孟宇航 指 導 教 師 吳 銳 計算機科學與技術學院 2024年…

〈軟件安裝管家軟件目錄〉?Windows系統版

①裝機常用 ?壓縮解壓WinRAR7-ZIPBandZip360壓縮?文件工具EverythingOneCommander XYplorer ReNamer ?卸載軟件CCleanerIObitUninstallerUninstall toolGeekAutodesk卸載Adobe卸載Ashampoo?驅動軟件驅動人生&#xff08;離線版&#xff09;驅動精靈&#xff08;離線版&…

CentOS Stream 8 Unit network.service not found

一、問題現象 在 CentOS Stream 8 操作系統中&#xff0c;配置完靜態IP 信息&#xff0c;想重啟網絡服務。 執行如下命令&#xff1a; systemctl restart network 提示信息如下&#xff1a; Failed to restart network.service: Unit network.service not found. 二、問題…

極空間z4pro配置gitea mysql,內網穿透

極空間z4pro配置gitea mysql等記錄&#xff0c;內網穿透 1、mysql、gitea鏡像下載&#xff0c;極空間不成功&#xff0c;先用自己電腦科學后下載鏡像,拉取代碼&#xff1a; docker pull --platform linux/amd64 gitea/gitea:1.23 docker pull --platform linux/amd64 mysql:5.…

[假面騎士] 龍騎淺談

作為一個偽二次元的我&#xff0c;總感覺目前沒有什么好番可追。結果某一天在小破站刷到了一個假面騎士相關的視頻&#xff0c;我就突發奇想&#xff0c;要不把假面騎士補完算了。 搜了搜&#xff0c;版權全在企鵝哪兒&#xff0c;不想充&#xff0c;于是去找了某盤的資源。果…

F5 GSLB 最佳實踐:如何手動將Wide IP 故障轉移到另一個數據中心

下面簡要介紹如何手動將 Wide IP(用于 DNS 負載均衡)故障轉移到另一個數據中心,并提供一些最佳實踐。假設您使用 F5 BIG-IP DNS(以前稱為 GTM)管理一個 Wide IP,該 IP 引用位于不同數據中心的虛擬服務器 (VIP)。 典型的 GSLB (BIG-IP DNS) 設置 Wide IP:表示您想要全局負…

FART 脫殼某大廠 App + CodeItem 修復 dex + 反編譯還原源碼

版權歸作者所有&#xff0c;如有轉發&#xff0c;請注明文章出處&#xff1a;https://cyrus-studio.github.io/blog/ FART 脫殼 fartthread 方法在 app 啟動的時候&#xff08;ActivityThread&#xff09;開啟 fart 線程&#xff0c;休眠 60 秒&#xff0c;等待 app 啟動完成后…

在maven項目中 繼續增加maven 項目

背景項目 基于若依項目 由于若依項目都是Maven項目有父子結構因此自己建項目 也需如此管理 添加子Maven項目 利用idea 自帶工具 maven archetype 這里選 webapp 骨架 在這里構建自己的項目架子即可 將 這個架子加入到啟動類中

網絡攻防技術十四:入侵檢測與網絡欺騙

文章目錄 一、入侵檢測概述二、入侵系統的分類三、入侵檢測的分析方法1、特征檢測&#xff08;濫用檢測、誤用檢測&#xff09;2、異常檢測 四、Snort入侵檢測系統五、網絡欺詐技術1、蜜罐2、蜜網3、網絡欺騙防御 六、簡答題1. 入侵檢測系統對防火墻的安全彌補作用主要體現在哪…

吳恩達MCP課程(5):mcp_chatbot_prompt_resource.py

前提條件&#xff1a; 1、吳恩達MCP課程&#xff08;5&#xff09;&#xff1a;research_server_prompt_resource.py 2、server_config_prompt_resource.json文件 {"mcpServers": {"filesystem": {"command": "npx","args"…