一、引言
上一篇文章我們已經詳細介紹了MongoDB數據庫的有關查詢的內容,但是這只是所有查詢命令的冰山一角。所有查詢命令都寫完也沒有必要,我只是寫了一些常用的命令,對MongoDB的操作有一個基本的認識,如果大家想繼續深入,可以根據自己的需要深入學習其他的命令。今天要講一些和更新、修改有關系的語句、命令或者方法,當然不可能是所有的命令了,也只是一些常用的命令。我提供給大家一個基礎,大家可以繼續深入,我也會繼續深入學習的。廢話不多說,馬上開始我們今天的寫作吧。
二、MongoDB有關修改的詳解
我比較直接,還是直接來內容吧,有關修改的每個方法都有示例代碼,應該不是很難,希望能起到拋磚引玉的作用吧。
1、update() 方法
1.1、update() 方法用於更新已存在的文檔。語法格式如下:
db.collectionName.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
參數說明:
query : update的查詢條件,類似sql update查詢內where后面的。
update : update的對象和一些更新的操作符(如$set,$inc...)等,也可以理解為sql update查詢內set后面的
upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入新的文檔,true為插入,默認是false,不插入。
multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,拋出異常的級別。
1.2、示例代碼
> db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } //修改【name】是【FangShiYu】的【age】字段的值為【25】 > db.students.update({"name":"FangShiYu"},{"$set":{"age":25}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 25, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
2、$set 修改器:針對指定字段設置指定的值,修改字段的值
語法:db.collectionName.update({query},{"$set":{<key>:<value>}})
參數說明:
query:查詢條件
key:要操作的字段名
value:要給key字段賦的值
在MongoDB數據庫中通過 $set 修改器和 update()方法配合使用,起到修改指定字段的作用。
2.1、示例代碼:
> db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } //修改【name】是【FangShiYu】的【age】字段的值為【25】 > db.students.update({"name":"FangShiYu"},{"$set":{"age":25}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 25, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } >
2、$inc 修改器:在數值字段在原有的基礎上再增加指定的數值,其值可以是正數,也可以是負數,負數是減多少
語法:db.collectionName.update({query},{"$inc":{<key>:number}})
參數說明:
query:查詢條件
key:要操作的字段名
number:增加的數量,可以是正數也可以是負數,正數相加,負數相減
在MongoDB數據庫中通過 $inc 修改器和 update()方法配合使用,起到讓數值字段在原有的基礎上增加指定的數值的作用。
2.1、示例代碼:【age】字段在原有基礎上加 【正數:1】
> db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 25, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } //修改【name】是【FangShiYu】的【age】字段的值,讓其值增加1,最受值為【26】 > db.students.update({"name":"FangShiYu"},{"$inc":{"age":1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 26, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } >
2.2、示例代碼:【age】字段在原有基礎上加 【負數:-5】
> db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 26, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } > db.students.update({"name":"FangShiYu"},{"$inc":{"age":-5}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 21, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } >
3、$push 修改器:針對指定的字段插入文檔列表,如果該字段不存在,會建立該字段並插入內文檔容,如果存在,就向該字段的列表里追加文檔內容。例如:留言板
documents={document}
語法:db.collectionName.update({query},{"$push":{<key>:document}})
參數說明:
query:查詢條件
document:一個文檔對象
key:要操作的字段名
在MongoDB數據庫中通過 $push 修改器和 update()方法配合使用,起到留言板的效果,比如:多個人可以給某一個女生留言,每條留言就是一個文檔,多個文檔組成列表
2.1、示例代碼:【messages】集合中原來沒有【comments】字段
//原始記錄 > db.messages.find() { "_id" : ObjectId("5abdc29b678c8239350e8a20"), "name" : "peny", "age" : 22, "sex" : 0 } > query={"name":"tom","say":"i love u!"} { "name" : "tom", "say" : "i love u!" } > db.messages.update({"name":"peny"},{"$push":{"comments":query}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) //網【messages】集合中增加了【comments】字段,並增加了一個列表,也可以說數組 > db.messages.find() { "_id" : ObjectId("5abdc29b678c8239350e8a20"), "name" : "peny", "age" : 22, "sex" : 0, "comments" : [ { "name" : "tom", "say" : "i love u!" } ] } >
2.2、示例代碼:在【messages】集合基礎上繼續向【comments】字段追加文檔內容
//原始記錄 > db.messages.find() { "_id" : ObjectId("5abdc29b678c8239350e8a20"), "name" : "peny", "age" : 22, "sex" : 0, "comments" : [ { "name" : "tom", "say" : "i love u!" } ] } > query={"name":"jim","say":"i want to know you!"} { "name" : "jim", "say" : "i want to know you!" } > db.messages.update({"name":"peny"},{"$push":{"comments":query}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.messages.find() { "_id" : ObjectId("5abdc29b678c8239350e8a20"), "name" : "peny", "age" : 22, "sex" : 0, "comments" : [ { "name" : "tom", "say" : "i love u!" }, { "name" : "jim", "say" : "i want to know you!" } ] } >
4、$each 修改器: $each 修改器、$push 修改器必須組合使用,可以一次增加由多個文檔組成的列表,字段有,就追加文檔,沒有就創建該字段並增加一個由多個文檔組成的列表數據
documents=[{document1},{document2},{document3}....{documentn}]
語法:db.collectionName.update({query},{"$push":{<key>:{"$each":documents}}})
參數說明:
query:查詢條件
documents:文檔列表,也可以稱文檔數組
key:要操作的字段名
在MongoDB數據庫中通過 $each 修改器、$push 修改器 和 update()方法配合使用,起到的作用類似一次插入由多個文檔組成的列表。
2.1、示例代碼:【messages】集合中原來沒有【comments】字段
//原始記錄 > db.messages.find() { "_id" : ObjectId("5abdc844678c8239350e8a21"), "name" : "peny", "age" : 22, "sex" : 0 } >query=[{"name":"tom","say":"hello!"},{"name":"jackey","say":"i love u!"},{"name":"jerry","say":"i want u"}]; [ { "name" : "tom", "say" : "hello!" }, { "name" : "jackey", "say" : "i love u!" }, { "name" : "jerry", "say" : "i want u" } ] > db.messages.update({"name":"peny"},{"$push":{"comments":{"$each":query}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.messages.find() { "_id" : ObjectId("5abdc844678c8239350e8a21"), "name" : "peny", "age" : 22, "sex" : 0, "comments" : [ { "name" : "tom", "say" : "hello!" },
{ "name" : "jackey", "say" : "i love u!" }, { "name" : "jerry", "say" : "i want u" } ] } >
2.2、示例代碼:在【messages】集合基礎上繼續向【comments】字段追加文檔內容
//原始記錄 > db.messages.find() { "_id" : ObjectId("5abdc844678c8239350e8a21"), "name" : "peny", "age" : 22, "sex" : 0, "comments" : [ { "name" : "tom", "say" : "hello!" }, { "name" : "jackey", "say" : "i love u!" }, { "name" : "jerry", "say" : "i want u" } ] } > query=[{"name":"jason","say":"i know you!"},{"name":"bob","say":"i miss you!"}]; [ { "name" : "jason", "say" : "i know you!" }, { "name" : "bob", "say" : "i miss you!" } ] > db.messages.update({"name":"peny"},{"$push":{"comments":{"$each":query}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) //追加了文檔數據 > db.messages.find() { "_id" : ObjectId("5abdc844678c8239350e8a21"), "name" : "peny", "age" : 22, "sex" : 0, "comments" : [ { "name" : "tom", "say" : "hello!" }, { "name" : "jackey", "say" : "i love u!" }, { "name" : "jerry", "say" : "i want u" }, { "name" : "jason", "say" : "i know you!" }, { "name" : "bob", "say" : "i miss you!" } ] } >
5、$slice 修改器:控制記錄保存的條數,如果以前有多條會把以前的清空保存條件所規定的記錄,如果操作的字段不存在,就會創建該字段
documents=[{document1},{document2},{document3}....{documentn}]
語法:db.collectionName.update({query},{$push:{<key>:{$each:documents,$slice:number}}})
參數說明:
query:查詢條件
documents:文檔列表,也可以稱文檔數組
key:要操作的字段名
number:控制顯示的數量,正數保留最早的number條記錄,負數保留最新的number條記錄
2.1、示例代碼:【messages】集合中原來沒有【comments】字段
//原始記錄 > db.messages.find() { "_id" : ObjectId("5abdceca678c8239350e8a22"), "name" : "peny", "age" : 18, "sex" : 0 } > var query=[{"name":"lilei","say":"hello"},{"name":"hanmeimei","say":"i miss u"},{"name":"tom","say":"i watch u"},{"monster":"ghost","say":"i want u"}]; //保存最早的兩條記錄,也就是【name】分別是:lilei和hanmeimei > db.messages.update({"name":"peny"},{$push:{"comments":{$each:query,$slice:2}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.messages.find() { "_id" : ObjectId("5abdceca678c8239350e8a22"), "name" : "peny", "age" : 18, "sex" : 0, "comments" : [ { "name" : "lilei", "say" : "hello" }, { "name" : "hanmeimei", "say" : "i miss u" } ] } >
2.2、示例代碼:在【messages】集合基礎上向【comments】字段文檔內容
//原始記錄 > db.messages.find() { "_id" : ObjectId("5abdceca678c8239350e8a22"), "name" : "peny", "age" : 18, "sex" : 0, "comments" : [ { "name" : "lilei", "say" : "hello" }, { "name" : "hanmeimei", "say" : "i miss u" } ] } > var query=[{"name":"tom","say":"i watch u"},{"monster":"ghost","say":"i want u"}]; //只會保留最新的記錄,也就是【name】的值是:monster的文檔 > db.messages.update({"name":"peny"},{$push:{"comments":{$each:query,$slice:1}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : -1 }) > db.messages.find() { "_id" : ObjectId("5abdceca678c8239350e8a22"), "name" : "peny", "age" : 18, "sex" : 0, "comments" : [ {"monster":"ghost","say":"i want u"}] } >
6、$addToSet 修改器:當插入一個數組時,如果數組中有重復記錄,只會直插入一條,不會重復插入,會過濾掉重復的記錄
documents=[{document1},{document2},{document3}...{documentn}]
語法:db.collectionName.update({query},{"$addToSet":{<key>:{"$each":documents}}})
參數說明:
query:查詢條件
documents:要插入的文檔數組,也可以稱作是列表,其中可以包含重復的文檔
<key>:表示要插入數組列表的字段
代碼實例:
//原始數據 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0" } //定義要插入的文檔數組,里面有重復記錄,只有最后一個文檔不同 > var documents=[{"name":"bob","say":"hi"},{"name":"bob","say":"hi"},{"name":"bob","say":"hi"},{"name":"bob","say":"hello"}]; //執行更新成功 > db.messages.update({"name":"peny"},{"$addToSet":{"comments":{"$each":documents}}}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) //查詢結果,值插入兩條記錄 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hi" }, { "name" : "bob", "say" : "hello" } ] } >
7、$pop修改器【刪除】:從數組中進行向前刪除或者向后刪除,+1正數表示從尾部開始刪除,-1負數表示從頭開始刪除。
語法:db.collectionName.update({query},{"$pop":{<key>:1(從后開始刪除)/-1(從頭開始刪除)}})
參數說明:
query:查詢條件
<key>:表示要執行刪除操作的字段名,該字段必須是數組字段
1(從后開始刪除)/-1(從頭開始刪除),只能是數字1和-1,其他值非法
代碼實例:
//原始數據 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hi" }, { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi2" }, { "name" : "bob", "say" : "hi3" }, { "name" : "bob", "say" : "hello5" } ] } //執行刪除操作,並且執行成功 > db.messages.update({"name":"peny"},{"$pop":{"comments":-1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) //執行結果,把comments數組的第一個元素刪除了 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi2" }, { "name" : "bob", "say" : "hi3" }, { "name" : "bob", "say" : "hello5" } ] }
8、$pull修改器【刪除】:根據指定條件刪除數組字段里面的指定文檔數據,pop只能刪除頭部或者尾部的數據
語法:db.collectionName.update({query},{"$pull":{<key>:{query2}}})
參數說明:
query:查詢條件
documents:要插入的文檔數組,也可以稱作是列表,其中可以包含重復的文檔
<key>:表示要執行刪除操作的字段名,該字段必須是數組字段
query2:查詢數組字段中指定文檔數據的查詢條件
代碼實例:
//原始數據 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi2" }, { "name" : "bob", "say" : "hi3" }, { "name" : "bob", "say" : "hello5" } ] } //執行刪除操作,並且執行成功 > db.messages.update({"name":"peny"},{"$pull":{"comments":{"say":"hi2"}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) //結果數據,已經刪除了說話內容是“hi2”的文檔 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi3" }, { "name" : "bob", "say" : "hello5" } ] }
9、下標操作符
9.1、根據查詢條件,確定要修改的記錄,然后對數組字段中第n(索引值是n-1)個文檔的指定指定字段進行值的修改
語法:db.collectionName.update({query},{"$set":{<key>.index.<key2>:<vlaue>}})
參數說明:
query:查詢條件,確定需要修改的文檔
$set:修改器,對某個字段進行賦值
<key>:表示要執行操作的字段名,該字段必須是數組字段,是頂級字段名
index:數組字段中包含多個文檔,每個文檔都對應這個一個具體的下標,不要過界,下標值從0開始,如:comments字段是留言板,該字段里面包含了5個文檔,每個文檔都是一份具體的留言內容,如果想引用數組字段中的某一個文檔,可以通過下標,comments.0.say,表示comments字段里面第一份留言say的內容是什么。
key2:具有指定下標值的文檔數據的字段名,這個字段的值將會被修改
value:把value表示的內容賦給key2所表示的字段
示例代碼:
//原始數據 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "hi3" }, { "name" : "bob", "say" : "hello5" } ] } //需要修改【comments】字段里面下標為【2】的【say】字段的值,修改成功 > db.messages.update({"name":"peny"},{"$set":{"comments.2.say":"i am modifing!"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) //修改成功 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "hi1" }, { "name" : "bob", "say" : "i am modifing!" }, { "name" : "bob", "say" : "hello5" } ] } //修改【comments】字段下標是【1】的【say】字段的值 > db.messages.update({"name":"peny"},{"$set":{"comments.1.say":"i am modifing!"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) //修改成功 > db.messages.find() { "_id" : ObjectId("5ac5b03525eb395526dc108d"), "name" : "peny", "age" : 18, "sex" : "0", "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "i am modifing!" }, { "name" : "bob", "say" : "i am modifing!" }, { "name" : "bob", "say" : "hello5" } ] }
9.2、$ 操作符,是一個通配符,可以操作所有符合條件的記錄(待測試)
語法:db.collectionName.update({query},{"$set":{<key>.$.<key2>:<vlaue>}})
參數說明:
query:查詢條件,確定需要修改的文檔
$set:修改器,進行賦值操作
<key>:表示要執行操作的字段名,該字段必須是數組字段,是頂級字段名
$:是指數組字段中所有的文檔,不會特指某一個文檔
key2:具有指定下標值的文檔數據的字段名,這個字段就是被修改的
value:把value表示的內容賦給key2所表示的字段
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5ac70d2f7a05450cf60c6887"), "name" : "peny", "age" : 18, "sex" : 0, "comments" : [ { "name" : "bob", "say" : "hello" }, { "name" : "bob", "say" : "i'm changing" }, { "name" : "tom", "say" : "i love y" } ] } //修改留言板里名稱是【name】是【bob】的文檔,把【say】字段的內容修改為【I'm a robbot】 > db.students.update({"comments.name":"bob"},{"$set":{"comments.$.say":"I'm robbot"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > //修改結果 > db.students.find() { "_id" : ObjectId("5ac70d2f7a05450cf60c6887"), "name" : "peny", "age" : 18, "sex" : 0, "comments" : [ { "name" : "bob", "say" : "I'm robbot" }, { "name" : "bob", "say" : "i'm changing" }, { "name" : "tom", "say" : "i love y" } ] }
10、upsert 狀態的使用:更新操作,也可以執行插入操作
語法:db.collectionName.update({query},{"$set":{<key1>:<value1>,<key2>:<value2>,...<keyn>:<valuen>}},insertBoolean)
如果查詢條件沒有找到相應的文檔,該表達式就會執行插入操作
語法:db.collectionName.update({query},{"$set":{<key1>:<value1>,<key2>:<value2>,...<keyn>:<valuen>}},insertBoolean,multiBoolean)
如果存在多條記錄,則會修改所有的文檔
參數說明:
query:查詢條件,確定需要修改的文檔
$set:修改器,用於賦值修改
key1-n:要操作的字段名
value1-n:需要給key字段賦的值,key和value一一對應。
insertBoolean:當記錄不存在的時候是否增加記錄,true表示增加,false表示不增加
multiBoolean:是否需要修改多條記錄,true表示可以修改多條記錄,false表示修改第一條記錄
示例代碼:
//原始數據是空的, > db.students.find() > //按通過修改增加數據 > db.students.update({"name":"peny"},{"$set":{"age":20,"sex":0}},true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("5ac7187f7da6f59ef2f3836a") }) > //數據插入成功 > db.students.find() { "_id" : ObjectId("5ac7187f7da6f59ef2f3836a"), "name" : "peny", "age" : 20, "sex" : 0 } > //如果數據庫中存在多條名稱重復的記錄,為每條記錄增加字段 //原始記錄,里面有兩個叫bob的文檔 > db.students.find() { "_id" : ObjectId("5ac7187f7da6f59ef2f3836a"), "name" : "peny", "age" : 20, "sex" : 0 } { "_id" : ObjectId("5ac7197f7a05450cf60c6888"), "name" : "bob", "age" : 23, "sex" : 1 } { "_id" : ObjectId("5ac7198b7a05450cf60c6889"), "name" : "bob", "age" : 18, "sex" : 1 } //修改了兩條,執行成功 > db.students.update({"name":"bob"},{"$set":{"school":"jiangxi"}},false,true) WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 }) //查看結果,已經為兩個叫bob的記錄增加了一個叫school的字段。 > db.students.find() { "_id" : ObjectId("5ac7187f7da6f59ef2f3836a"), "name" : "peny", "age" : 20, "sex" : 0 } { "_id" : ObjectId("5ac7197f7a05450cf60c6888"), "name" : "bob", "age" : 23, "sex" : 1, "school" : "jiangxi" } { "_id" : ObjectId("5ac7198b7a05450cf60c6889"), "name" : "bob", "age" : 18, "sex" : 1, "school" : "jiangxi" }
三、總結
今天就寫到這里了,有關更新的內容還很多,今天只是介紹一個大概的內容,讓大家對MongoDB的操作有一個初步的印象。隨着我們學習的深入,還會有更多的內容更新上來,不忘初衷,繼續努力吧。