Mongodb基礎知識筆記

来源:https://www.cnblogs.com/wuhuan-think/archive/2019/01/10/10248241.html
-Advertisement-
Play Games

MongoDB介紹 MongoDB是一個基於分散式文件存儲的開源文檔資料庫。由C++語言編寫。旨在為WEB應用提供高性能、高可用性和高伸縮數據存儲解決方案。 MongoDB優點 MongoDB使用場景 數據緩存 由於性能很高,MongoDB適合作為信息基礎設施的緩存層。在系統重啟之後,由MongoD ...


MongoDB介紹

MongoDB是一個基於分散式文件存儲的開源文檔資料庫。由C++語言編寫。旨在為WEB應用提供高性能、高可用性和高伸縮數據存儲解決方案。

MongoDB優點

MongoDB優點

MongoDB使用場景

  • 數據緩存

    由於性能很高,MongoDB適合作為信息基礎設施的緩存層。在系統重啟之後,由MongoDB搭建的持久化緩存層可以避免下層的數據源過載。

  • 對象和json存儲

    MongoDB的BSON(二進位JSON)數據格式非常適合文檔化格式的存儲及查詢,而且JSON格式存儲最接近真實對象模型,對開發者友好,方便快速開發迭代,靈活的模式讓你不在為了不斷變化的需求而去頻繁修改資料庫欄位和結構。

  • 高伸縮性場景

    MongoDB通過分片集群,使MongoDB服務能力易於水平擴展。

  • 弱事務類型業務

    MongoDB不支持多文檔事務,所以像銀行系統這種需要大量原子性複雜事務的程式不適合使用MongoDB。(註:MongoDB 4.0將支持跨文檔的事務)

MongoDB版本特性介紹

MongoDB概念

通過和關係型資料庫mysql的對照,讓我們更容易的理解MongoDB的一些概念

關係型資料庫(sql)概念 MongoDB概念 說明
database database 資料庫
table collection 資料庫表/集合
row document 數據行/文檔
column filed 數據欄位/域
index index 索引

MongoDB數據關係圖

資料庫

  • 一個MongoDB中可以建立多個資料庫。

  • MongoDB的預設資料庫為"db",該資料庫存儲在data目錄中

集合

  • 集合名不能以"system."開頭

  • 關係型資料庫中的表(table)中的每一條數據(row)的格式是事先約定好的的,而MongoDB中的集合(collection)中文檔(document)的數據格式是不固定的,也就是說我們可以將如下數據插入統一文檔中。

{"site":"www.wuhuan.me"}
{"site":"www.baidu.com","name":"百度"}

文檔

  • 文檔中的值不僅可以是在雙引號裡面的字元串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)

例如:在關係型資料庫中有一張students表和course表,表的結構和數據如下:

students表

id name sex age
1 李雷 0 12
2 韓梅梅 1 12

course表

id course_id course_name score user_id
1 1 語文 99 1
2 2 數學 100 1
3 1 語文 96 2
4 2 數學 98 3

以上數據和結構在MongoDB中可以使用內嵌文檔來表示(一對多)的關係:

{
  "_id":ObjectId("5349b4ddd2781d08c09890f3"),
  "name":"李雷",
  "sex":"0",
  "age":"12",
  "course":[{
    "course_id":1,
    "course_name":"語文",
    "score":99,
  },{
    "course_id":2,
    "course_name":"數學",
    "score":100,
  }]
}
{
  "_id":ObjectId("5349b4ddd2781d08c09890f4"),
  "name":"韓梅梅",
  "sex":"1",
  "age":"12",
  "course":[{
    "course_id":1,
    "course_name":"語文",
    "score":96,
  },{
    "course_id":2,
    "course_name":"數學",
    "score":98,
  }]
}
  • 文檔中的鍵/值對是有序的,文檔中的鍵是不能重覆,且區分大小寫。

數據類型

數據類型 描述
String 字元串。存儲數據常用的數據類型。在 MongoDB 中,UTF-8 編碼的字元串才是合法的。
Integer 整型數值。用於存儲數值。根據你所採用的伺服器,可分為 32 位或 64 位。
Boolean 布爾值。用於存儲布爾值(真/假)。
Double 雙精度浮點值。用於存儲浮點值。
Min/Max keys 將一個值與 BSON(二進位的 JSON)元素的最低值和最高值相對比。
Array 用於將數組或列表或多個值存儲為一個鍵。
Timestamp 時間戳。記錄文檔修改或添加的具體時間。
Object 用於內嵌文檔。
Null 用於創建空值。
Symbol 符號。該數據類型基本上等同於字元串類型,但不同的是,它一般用於採用特殊符號類型的語言。
Date 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你可以指定自己的日期時間:創建 Date 對象,傳入年月日信息。
Object ID 對象 ID。用於創建文檔的 ID。
Binary Data 二進位數據。用於存儲二進位數據。
Code 代碼類型。用於在文檔中存儲 JavaScript 代碼。
Regular expression 正則表達式類型。用於存儲正則表達式。

ObjectId

MongoDB文檔必須有一個預設的**_id鍵,且在一個集合里_id始終唯一。_id**鍵的值可以是任何類型的,預設是個ObjectId對象,它由MongoDB資料庫自動創建。MongoDB使用objectId而不是使用常規做法(自增主鍵)主要原因是,在多個伺服器(分散式)同步自動增加主鍵費力費時。

ObjectId由12個位元組的BSON組成

  • 前4個位元組表示時間戳

  • 接下來的3個位元組是機器標識碼

  • 緊接的兩個位元組由進程id組成(PID)

  • 最後三個位元組是隨機數。

創建新的ObjectId

我們可以在命令行通過如下語句來創建一個新的ObjectId

> newId=ObjectId()

上面語句將返回一個唯一的_id

ObjectId("1249b4ddd2712d08c09890f3")

也可以使用生成的ObjectId替換MongoDB自動生成的ObjectId。

MongoDB基本使用

安裝資料庫

在windows安裝MongoDB比較簡單在官網MongoDB下載地址下載對應的windows安裝包一鍵安裝就行了。

安裝完之後記得將MongoDB安裝目錄下的bin目錄加入到系統的環境變數中。

啟動資料庫

啟動資料庫使用mongod命令

  • 方式一:普通方式啟動
> mongod --dbpath  E:\MongoDB\data\db  #不使用預設埠的話可以加上--port=[埠號]參數

E:\data\db為數據文件路徑

  • 方式二:通過配置文件啟動
> mongod --config E:\MongoDB\mongo.conf

E:\MongoDB\mongo.conf為配置文件路徑,配置文件內容為:

# 服務埠
port=27017
# 數據文件路徑
dbpath=E:\mongondb\data\db 
# 日誌文件路徑
logpath=E:\mongondb\log\mongon.log
# 打開日誌輸出操作
logappend=true
# 不使用任何的驗證方式登錄
noauth=true

連接資料庫

連接資料庫使用mongo [,鏈接字元串]連接url的標準語法如下

mongodb://[username:password@]host[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  • 登錄本地預設資料庫伺服器,無用戶名密碼,埠預設27017,鏈接預設的db資料庫
> mongo mongodb://localhost/db 

或者

> mongo 
  • 使用用戶名admin、密碼123456,登錄本地埠為27017的test資料庫。
> mongo mongodb://admin:123456@localhost:27017/test

創建資料庫

創建資料庫使用use [資料庫名],例如創建一個test123的資料庫

> use test123
switched to db test123
> db
test123

顯示當前所有的資料庫可以使用命令show dbs

> show dbs
db     0.001GB
local  0.000GB

怎麼沒有我們剛纔創建的test123呢?那是因為資料庫中還沒有內容,我們向test123中插入db.[集合名稱].insert(json格式的數據對象)一條數據,再看看!

> show dbs
db     0.001GB
local  0.000GB
> use test123
switched to db test123
> db
test123
> db.coll.insert({"title":"not data!"})
WriteResult({ "nInserted" : 1 })
> show dbs
db       0.001GB
local    0.000GB
test123  0.000GB

查看db.[集合名稱].find()剛纔添加的數據

> use test123
switched to db test123
> db.coll.find()
{ "_id" : ObjectId("5a66e39914fea5f8ff237420"), "title" : "not data!" }

使用use命令如果資料庫不存在則創建,存在則切換到指定的資料庫。

刪除資料庫

刪除資料庫使用db.dropDatabase()函數進行

首先查看所有的資料庫

> show dbs
db       0.001GB
local    0.000GB
test123  0.000GB

接著切換到要刪除的資料庫test123

> use test123
switched to db test123

刪除當前資料庫

> db.dropDatabase()
{ "dropped" : "test123", "ok" : 1 }  #刪除成功

數據增加

數據添加方法:insert(),insertOne(),insertMany()

添加一條數據

/** insert()方法 **/

> db.person.insert({name:"張三",age:18,sex:"男"});
WriteResult({ "nInserted" : 1 })
> db.person.find()                             });
{ "_id" : ObjectId("5a7941c65f6d5986321c8416"), "name" : "張三", "age" : 18, "sex" : "男" }

/** insertOne()方法插入一條數據 **/

> db.person.insertOne({name:"張三",age:18,sex:"男"});
{                                               dered:true})
        "acknowledged" : true,
        "insertedId" : ObjectId("5a7965855f6d5986321c8422")
}
> db.person.find()
{ "_id" : ObjectId("5a7965855f6d5986321c8422"), "name" : "張三", "age" : 18, "sex" : "男" }
>

添加多條數據

*** 方式一 把要插入的數據放在一個數組中進行批量插入***


/** insert()方法 **/

> db.person.insert( [ {name:"張三",age:18,sex:"男"}, {name:"李四",age:21,sex:"女"}, {name:"王五",age:20,sex:"男"}, {name:"趙六",age:19,sex:"女"} ],{ordered:true})
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 4,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

/** insertMany()方法 **/

> db.person.insertMany( [ {name:"張三",age:18,sex:"男"}, {name:"李四",age:21,sex:"女"}, {name:"王五",age:20,sex:"男"}, {name:"趙六",age:19,sex:"女"} ],{ordered:true})
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("5a7969ec5f6d5986321c8430"),
                ObjectId("5a7969ec5f6d5986321c8431"),
                ObjectId("5a7969ec5f6d5986321c8432"),
                ObjectId("5a7969ec5f6d5986321c8433")
        ]
}

多加了一個參數{ordered:true}表示有序插入, 有序插入碰到異常時它會直接返回,不會繼續插入數組中其餘的文檔記錄。不加此參數或者{ordered:false}為無序插入, 無序的插入會在遇到異常時繼續執行

*** 方式二 使用bluk對象進行數據的批量添加 ***

  • 第一步:初始化一個批量操作對象
var bulk = db.person.initializeUnorderedBulkOp();
  • 第二步:把要添加的數據添加到bulk對象中
bulk.insert({name:"趙六",age:19,sex:"女"});
bulk.insert({name:"趙六",age:19,sex:"女"});
bulk.insert({name:"趙六",age:19,sex:"女"});
  • 第三步:真正添加到資料庫的方法
bulk.execute();

插入文檔你也可以使用 db.集合名稱.save(document) 命令。如果不指定 _id 欄位 save() 方法類似於 insert() 方法。如果指定 _id 欄位,則會更新該 _id 的數據。

insert()方法既可以插入一個數組也可插入一個對象,insertOne()方法只能插如一個對象,insertMany()只能插入一個數組,insert()返回插入成功的記錄條數,而insertOne()和insertMany()方法返回成功標誌和插入成功的_objectId

數據查詢

查詢命令:find(),findOne()

findOne()方法查詢的結果已經格式化輸出了,find()方法要想格式化輸出數據調用pertty()修飾查詢方法也能達到相同的效果。

舉例:db.person.find({age:18})
查詢年齡等於18的人的所有信息

舉例:db.person.find({age:{$gt:18}},{name:1,sex:1})
查詢db資料庫中person集合中年齡大於18的人的姓名和性別

說明:如果年齡小於18可以使用$lt操作符,第二個參數{name:1,sex:1}裡面表示顯示的欄位,如果不想顯示某個欄位那麼就不用寫如果第二個參數是{name:1},那麼表示只顯示姓名欄位,如果整個第二個參數都不寫,那麼預設顯示所有的欄位

修飾查詢的方法:limit()【限制條數】,sort()【排序】,skip()【跳過】,pretty()【美化格式】

舉例:db.person.find({age:{$gt:18}},{name:1,sex:1,age:1}).sort({age:-1}).limit(3).skip(1).pretty()
查詢db資料庫中person集合中年齡大於18的人的姓名和性別,然後按照年齡降序排列,然後取排列後的數據的前三條,然後再跳過一條數據後的集合

說明:sort({age:-1})中的【-1】表示降序排列,如果升序排列寫成sort({age:1})就可以。

數據刪除

刪除方法:remove(),drop()

1、remove()和drop()方法的區別

舉例:db.person.remove({})
remove方法中傳遞一個空數對象,會刪掉db資料庫中的person集合中的所有的文檔,但是不會刪除索引

舉例:db.person.drop()
會刪除db資料庫中的person集合中的所有的文檔,並且還會刪除person集合中所有的索引。效率更高。

2、刪除匹配條件的文檔

舉例:db.person.remove({name:"張三"})
刪除db資料庫中person集合中name等於張三的所有文檔。

3、刪除一條記錄

舉例:
方法1 db.person.remove({name:"張三"},{justOne:true});
方法2 db.person.remove({name:"張三"},1);

只刪除一個匹配條件的文檔

數據修改

修改方法:update()

1、$set操作符
舉例:db.person.update({name:"張三"},{$set:{age:19}})
修改名字為張三的人的年齡為19歲,只修改一條記錄

2、$currentDate操作符的作用
舉例:db.person.update({name:"張三"},{ $set:{age:"123456"},$currentDate: { lastModified: true }})
為當前修改的文檔添加一個最後修改時間的欄位

3、{multi:true}參數的作用
舉例:db.person.update({name:"張三"},{$set:{age:20},$currentDate: { lastModified: true }},{multi:true})
預設情況下只修改符合條件的一個文檔,如果多個文檔符合條件並且都要修改只需要添加第三個參數{multi:true}就可以修改多個文檔了。

4、upsert選項的作用
舉例:db.person.update({name:"張三"},{name:'張三三',age:20,sex:"男"},{upsert:true})
預設情況下匹配不到更新條件的文檔,update將不做任何操作,如果添加了{upsert:true}參數,在沒有找到匹配文檔的情況下,它將會插入一個新的文檔。

註意:mongondb在修改數據的時候回根據數據的類型自動修改文檔中原始的數據類型,例如一個文檔中的年齡為數字類型,你修改這個記錄的時候把年齡傳入一個字元串,那麼此文檔中年齡欄位的類型就變成了字元串類型。

索引

索引通常能夠極大的提高查詢的效率,就像書的目錄一樣,如果沒有索引mongodb就會去掃描集合中的每個文件並選取符合查詢條件的數據,在數據量大的時候這種查詢相率很低下

使用db.集合名稱.getIndexes()獲取集合索引

> db.person.getIndexes()
[
        {  //person集合的預設索引
                "v" : 1, //升序排列
                "key" : {
                        "_id" : 1 //索引列
                },
                "name" : "_id_", //索引名稱
                "ns" : "test.person" //指定集合
        }
]

創建索引

創建索引的方法:createIndex()

舉例:db.person.createIndex({"name":1})
在person集合中針對name欄位創建一個升序排列的索引

> db.person.getIndexes()
[
        { // 預設索引
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        { //新創建的索引
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]

刪除索引

刪除索引使用命令:dropIndex()
舉例:db.person.dropIndexes({"name":1})

> db.person.getIndexes() //查詢索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        {
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]
> db.person.dropIndex({"name":1})  //刪除
{ "nIndexesWas" : 2, "ok" : 1 }
> db.person.getIndexes() //查詢索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        }
]

刪除全部索引使用命令:dropIndexes()
舉例:db.person.dropIndexes()

> db.person.getIndexes() //查詢索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        {
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]
> db.person.dropIndexes() //刪除全部索引
{
        "nIndexesWas" : 2,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}
> db.person.getIndexes() //查詢索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        }
]

刪除全部索引指的是:name為非_id_的索引(預設索引)

導出數據文件

mongodump -h IP --port 埠 -u 用戶名 -p 密碼 -d 資料庫 -o 文件存在路徑 
  • 如果沒有用戶誰,可以去掉-u和-p。
  • 如果導出本機的資料庫,可以去掉-h。
  • 如果是預設埠,可以去掉--port。
  • 如果想導出所有資料庫,可以去掉-d。

導出全部數據資料庫

mongodump -h 127.0.0.1 -o E:\mongondb\dump 

導入數據文件

> mongorestore -h IP --port 埠 -u 用戶名 -p 密碼 -d 資料庫 --drop 文件存在路徑 

--drop參數:先刪除所有的記錄,然後恢復。

導入全部資料庫

> mongorestore E:\mongondb\dump #資料庫的備份路徑

導入test123資料庫

> mongorestore -d user E:\mongondb\dump\test123  #test123這個資料庫的備份路徑  

原文地址


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

-Advertisement-
Play Games
更多相關文章
  • 狂神聲明 : 文章均為自己的學習筆記 , 轉載一定註明出處 ; 編輯不易 , 防君子不防小人~共勉 ! mysql學習【第2篇】:MySQL數據管理 外鍵管理 外鍵概念 如果公共關鍵字在一個關係中是主關鍵字,那麼這個公共關鍵字被稱為另一個關係的外鍵。由此可見,外鍵表示了兩個關係之間的相關聯繫。以另一 ...
  • http://toplchx.iteye.com/blog/2091860 使用EXPLAIN PostgreSQL為每個收到的查詢設計一個查詢規劃。選擇正確的匹配查詢結構和數據屬性的規劃對執行效率是至關重要要的,所以系統包含一個複雜的規劃器來試圖選擇好的規劃。你可以使用EXPLAIN命令查看查詢規 ...
  • 這個問題可以這樣解決:就在在Oracle中登入SDE資料庫 進入到SDE資料庫中後,找到表SERVER_CONFIG,其中有一行數據記錄的就是我們需要進行修改的數據 你需要做的就是找到一個可用的,前面為arcsdeserver的一個許可字元串,比如下麵這個:arcsdeserver,100,ecp. ...
  • 本文由雲+社區發表 1.概述 binlog是Mysql sever層維護的一種二進位日誌,與innodb引擎中的redo/undo log是完全不同的日誌;其主要是用來記錄對mysql數據更新或潛在發生更新的SQL語句,並以”事務”的形式保存在磁碟中; 作用主要有: [x] 複製:MySQL Rep ...
  • 設置MYSQL資料庫編碼為UTF-8 1、 編輯MySql的配置文件 MySql的配置文件Windows下一般在系統目錄下或者在MySql的安裝目錄下名字叫my.ini,可以搜索,Linux下一般是/etc/my.cnf --在 [mysqld] 標簽下加上以下內容: default-charact ...
  • 一般網上的方法: 但是上面的語法不會複製舊表的預設值、註釋、鍵和索引,因此想要完美的複製表結構就需要先找到舊表的sql語句,然後進行修改,在此記錄一下我在PL/SQL上進行的操作; 1. 打開PL/SQL並連接上資料庫(本地需配置tnsnames.ora文件); 2. 新建—命令視窗—ed 表名,以 ...
  • 資料庫版本:oracle11g 11.0.2.0.4 SQL> desc x$ksppi; Name Null? Type ADDR RAW(8) >記憶體地址 INDX NUMBER >序號 INST_ID NUMBER >instance number KSPPINM VARCHAR2(80) > ...
  • 監控 redis 執行命令 Intro 最近在用 redis 的時候想看看執行了哪些命令,於是發現了 redis cli 提供的 命令,直接使用這個就可以監控執行的大部分 redis 命令,之所以說是大部分,是因為有一些命令如: 出於安全原因是不會記錄的。 Monitor 是調試用的命令 Redis ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...