Intel 官方 Twitter 釋出調侃 M1 廣告,這些是你在 Mac 上無法做的事

自從 Apple M1 推出以來好評就不斷,不少國外媒體與 YouTuber 測試數據都指出各方面勝出 Intel 許多。而沉寂許久的 Intel 近期終於開始反擊,繼幾天前釋出官方測試數據外,稍早更於官方 Twitter 分享調侃廣告,告訴你哪些事情只有 PC 能做到,Mac 則無法。

Intel 官方 Twitter 釋出調侃 M1 廣告

一直以來 Intel 與 Apple 都有密切合作,也因此關係不錯,即便現在還是有一些 Mac 機型依舊搭載 Intel 處理器。但不知道是不是 Mac 逐漸要改用 Apple 自家晶片關係,Intel 不再顧慮到這點,近期可說來勢洶洶。

最近在 Intel 官方 Twitter 上,陸續出現調侃廣告,像下面這則關於遊戲支援性,「如果你可以啟動火箭聯盟,那你就不該使用 Mac」,火箭聯盟遊戲去年三月就不支援 Mac:

Only a PC can power scientists and gamers alike. #GoPC

— Intel (@intel) February 10, 2021

雖然 Mac 改用 M1 晶片之後,能玩的遊戲確實比過去舊機型多,但相較於 Windows 差距還是非常大,更別提一些 3A 遊戲大作。

另外還有一則「只有 PC 能一台實現平版模式、觸控螢幕與支援觸控筆功能,Mac 不行」:

Only a PC offers tablet mode, touch screen and stylus capabilities in a single device. #GoPC

— Intel (@intel) February 2, 2021

這兩則廣告都連結到一部由國外知名 YouTuber 錄製的影片,裡面就介紹著 Intel 最新 Evo 平台筆電的特色,以及跟 M1 MacBook 比較的優勢,像是有標準的 USB 傳輸埠、觸控螢幕、支援 eGPU 等等,有興趣的人也能看看:

 

看到 Intel 硬起來還真有點不習慣,不過廣告說的這些事情,也確實是事實,Mac 現在完全無法做到。

下方是前幾天 Intel 釋出的官方測試數據圖(M1 MacBook Pro 16GB vs Intel Core i7-1185G7 16GB),詳細報導可閱讀這篇。

在內容創作效能部分,Intel 都比 M1 還要好,特別是 Topaz Labs:

生產力效能方面,Intel 也勝出不少:

遊戲效能測試也沒缺席,Hitman 雖然 M1 表現最好,但其餘都輸 Intel,還有不少款遊戲因為不支援,所以無法測試:

圖片來源:Toms Hardware

國外零售商洩漏 Intel 第 11 代 Rocket Lake-S 處理器的售價,i9-11900K 價格比上一代便宜一些

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

網頁設計最專業,超強功能平台可客製化

iPhone 12 Pro Max 對決三星 Galaxy S21 Ultra 應用程式啟動速度實戰

先前我們才分享過 YouTube 頻道 PhoneBuff 進行 iPhone 12 Pro Max 對決三星 Galaxy S21 Ultra 跌落測試,當時 iPhone 12 Pro Max 在耐摔方面取得勝利。不過回歸日常使用手機使用面,選擇這類旗艦級手機的用戶往往對於手機效能更為要求,因此開啟應用程式的開啟速度也是最為有感的一種方式。
這次 PhoneBuff 就找來 iPhone 12 Pro Max 進營最直接的應用程式啟動速度實戰,究竟三星在這一回 Galaxy S21 Ultra 能扳回勝利嗎?

iPhone 12 Pro Max 對決三星 Galaxy S21 Ultra 應用程式啟動速度實戰

在開始測試前比較一下兩款手機的規格配置,首先三星 Galaxy S21 Ultra 搭載 Qualcomm Snapdragon 888 行動平台、配備 12GB RAM 和 128GB ROM ,而 iPhone 12 Pro Max 則搭載 Apple A14 仿生晶片、 6GB RAM 和 128GB ROM :

這次 PhoneBuff 的測試將同時分別在 Galxay S21 Ultra 與 iPhone 12 Pro Max 依序開啟相同的應用程式,藉此比較出兩者在開啟各款 App 所需的時間。在第一輪開啟的前五款 App 依序為 Facebook 、 Starbucks 、 Word 、 Excel 以及相機 App ,在這階段 Galaxy S21 Ultra 以些微差距領先:

不過隨著後續執行更多不同類型的 App 後,換成 iPhone 12 Pro Max 取得領先:

在第一輪開啟共 16 款不同類型的 App ,計算出 iPhone 12 Pro Max 所需要的時間為 1 分 46 秒 74 ,而 Galaxy S21 Ultra 則需要 1 分  54 秒 64 :

接著第二輪重新開啟第一輪的所有 App ,最終在第二輪 iPhone 12 Pro Max 用了 43 秒 23 ,而 Galaxy S21 Ultra 則需要 45 秒 98 :

最終分析 iPhone 12 Pro Max 和 Galaxy S21 Ultra 開啟不同款 App 所需要的時間整理如下:

完整測試影片

 

圖片/消息來源: PhoneBuff(YouTube)

延伸閱讀:
華碩傳聞將在今年推出小尺寸旗艦 ZenFone mini , ROG Phone 5 於 4 月推出、價格將高於 ROG Phone 3

小米首款「四曲瀑布螢幕概念手機」正式亮相!四邊 88° 超曲面螢幕、螢幕下前鏡頭、整機一體無孔化設計

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

網頁設計最專業,超強功能平台可客製化

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家公司費用怎麼算?

小米11 非官方拆解影片來了!有更多官方未提到的設計小巧思

在小米11 國際版於歐洲發表後,在 YouTube 的知名虐機頻道 JerryRigEverything 日前除了針對這款小米發表的首款 Snapdragon 888 旗艦手機小米11 進行虐機測試,其實也有針對這款小米新旗艦進行手機拆解,比起先前小米官方親自釋出的拆機影片, JerryRigEverything 的拆機則帶大家看到更多小米官方未提及的設計細節。 

小米11 非官方拆解影片來了!有更多官方未提到的設計小巧思

除了虐機測試考驗著手機螢幕、機身的耐用性表現,近日 JerryRigEverything 也為大家帶來小米11 的拆解影片,在卸下小米11 的玻璃後蓋後,可以看到一片大尺寸的無線充電線圈,可幫助小米11 完成最高 50W 的無線充電。

在小米11 機身內部的周圍的螺絲可以發現以不同顏色區分,例如其中有包括大量綠色的螺絲,這對於維修人員在作業時也更為方便:

另外,小米11 主相機的鏡頭蓋採用金屬製成:

小米11 搭載 2000 萬像素前置鏡頭相機:

小米11 搭載 1.08 億像素 AI 三鏡頭主相機,分別為 1.08 億像素廣角鏡頭為主鏡頭,搭配 1300 萬像素 123° 超廣角鏡頭 500 萬像素長焦微距鏡頭:

接著看到電池部分,小米11 內部電池旁有拆卸指引的貼片,只需依照指示即可輕鬆拆卸電池進行維修。

電池容量部分,小米11 內建等效 4,600mAh (typ) 高容量電池,實際上使用兩節單獨的電池以雙電池形式組合在一起,雙電池設計比起傳統單體電池組具備更快的充電效率。小米11 在充電方面支持 55W 有線快充、 50W無線快充以及10W 無線反充,小米11 國際版也將標配 55W GaN 氮化鎵充電器。

小米11 完整拆機影片

 

圖片/消息來源: JerryRigEverything(YouTube)

延伸閱讀:
小米11 骨牌挑戰影片!以 4100支成功完成挑戰

小米MIX系列「可量產」新機確認將在今年即將回歸,另有小米平板也將登場

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※回頭車貨運收費標準

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

想不到7.5萬起車型開起來比14萬的車還更爽!

38-11。28萬本田飛度有着“知乎神車”的稱號,原因10萬以內沒能找到一輛這樣低油耗、加速快以及高保值率的合資車。它使用的是1。5L地球夢發動機,最大功率96千瓦,配合5MT手動變速箱,可以實現9s以內的百公里加速時間,另外還有CVT變速箱可以選擇。

前言

“才六七萬錢的車,能開就行了,還要什麼操控樂趣?”,相信這句話是不少人都聽到過的,認為低價位的汽車都是比較無聊的,但是有沒有想過有些六七萬起售的汽車能給到你超越價格的樂趣,甚至要比貴了一倍價錢的車型還要好玩?

小型車,其實是一個被忽略的市場,在國產緊湊型轎車以及小型SUV的轟炸下,合資小型車的市場份額被逐漸蠶食。以前那種合資小型車百花齊放的景象已經看不到了,前些年年輕人都追求的是這種有着絕佳的操控樂趣小車。

它們都有着小巧的車身,在車流中可以非常靈活地穿梭;有着精準的操控,坐在車內有着一種人車合一的感覺;有着極低的重心,即使在山道也能有着較佳的車身姿態。有着類似卡丁車的操控樂趣,而且還有着較高的改裝潛力。

上汽大眾-pOLO

官方指導價:7.59-14.69萬

作為德系的代表,大眾pOLO有着極高的造詣,小巧的車身配合精準的操控,這輛小型車有着超高的駕駛樂趣,較高速度過彎都能有着一個極佳的姿態。所以在不少車隊甚至是大眾官方都是將其作為賽車車型的首選,價格低操控好而且改裝潛力大。

不過對於家庭用戶來說,後排空間就相對局促。動力方面有着1.4L以及1.6L自然吸氣發動機可以選擇,變速箱則是5MT以及6AT變速箱可以選擇,不過更推薦的是5MT,傳動效率高動力佳,而且檔位清晰,離合容易控制,上手難度低。

廣汽本田-飛度

官方指導價:7.38-11.28萬

本田飛度有着“知乎神車”的稱號,原因10萬以內沒能找到一輛這樣低油耗、加速快以及高保值率的合資車。它使用的是1.5L地球夢發動機,最大功率96千瓦,配合5MT手動變速箱,可以實現9s以內的百公里加速時間,另外還有CVT變速箱可以選擇。

它還有着極其優秀的車廂空間,完全不亞於某些合資緊湊型轎車,加上低油耗的特點非常適合家庭使用。動力強以及手感極好的手動變速箱,讓它有着超高的加速性能,不過過彎的時候側傾稍微有點大,但幸好可以通過改裝改善。

長安鈴木-雨燕

官方指導價:5.98-8.28萬

鈴木雨燕是之前小型車大熱時的產物,到如今那麼多年都僅僅是對外觀進行小小的修改,所以有着當初那種最佳的駕駛樂趣,不過也是因為這麼多年都沒有進行性能上的改進而為人所詬病。發動機方面有着1.3L以及1.5L兩種排量可以選擇,1.5L自然吸氣發動機最大功率76千瓦,相對弱勢。

但配合5MT手動變速箱操控極佳,加上優秀的底盤表現以及改裝潛力使得它是第三代飛度之前最熱的改裝車,如今在不少賽車場都可以看到它的蹤影。並且對於某些改裝發燒友來說,可以無損改裝進口速翼特的M16A發動機也是重大的優勢,動力輸出更加,高轉有着極其優秀的表現和魅力。

編輯總結:

以上三款汽車都可以說是這個價位中操控最好的代表,甚至比起12萬左右的合資緊湊型轎車還要優秀。價格基本可以在不到7萬可以買到,尤其是大眾pOLO,終端起售價甚至可以在6.5萬左右,非常適合追求駕駛樂趣的年輕人。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

奇瑞全新小型SUV瑞虎3x智趣上市 售價5.89-8.09萬元

9L,燃油經濟性十分突出。瑞虎3x大量選用環保材料技術,在零件、系統、整車各個階段對內飾空氣質量層層監控,營造綠色、環保、低氣味的內飾空間。同時,瑞虎3x遵循五星安全標準設計,具有高強度車身結構和嚴謹的製造工藝,不僅擁有輕量化前防撞鋼樑、環護式四位一體安全氣囊的全方位被動安全配置,還配備了全方位倒車雷達+動態輔助倒車影像系統、全新ESC車身穩定系統、TpMS直接式胎壓監測、EBA剎車輔助控制系統、上坡輔助HHC等越級高科技主動安全配置,全方位保障用戶行車安全。

11月15日,奇瑞全新小型SUV—瑞虎3x正式上市。新車共推出搭載1.5VVT發動機共10款車型,售價5.89萬——8.09萬元。

瑞虎3x是奇瑞戰略2.0體系下的第三款全新產品,將以“同級首款4G互聯SUV”的優勢進軍小型SUV市場,並與此前上市的新瑞虎3共同組成產品雙擎,進一步完善瑞虎家族產品線,實現對年輕時尚細分市場的全面覆蓋。

以“智趣”為標籤的瑞虎3x是奇瑞基於當下年輕消費群體的用車需求以及SUV年輕化、智能化、個性化的發展趨勢,為追求獨特個性、玩樂精神的年輕群體量身打造的一款“4G智趣SUV”。

“全新品質標杆” 引領小型SUV新潮流

作為奇瑞2.0產品的新一代小型SUV,無論是引領潮流的造型設計,還是智能互聯的科技屬性,都讓瑞虎3x領先一步樹立起小型SUV市場的全新品質標杆。

雖然是一款體量小的SUV,但瑞虎3x在尺寸空間和動力性能上都有獨特優勢。4200 *1760 *1570 mm的車身尺寸和2555 mm的超長軸距全面超越同級競爭對手。合理的設計使瑞虎3x在實際空間的表現上更為突出,提供了同級別最優的前排頭腿部空間、後排頭部空間,高達420L的後備箱載物空間也是同級容積最大。升級后的1.5VVT全國十佳發動機匹配5MT/4AT兩款變速箱,使瑞虎3x的最大輸出功率高達106馬力。百公里40m制動距離、186mm的最小離地間隙、24°接近角、32°離去角更是造就了瑞虎3x的同級最優通過性。

憑藉奇瑞2.0體系的強大支撐,瑞虎3x的品質和可靠性比肩國際水準。在耐久可靠性方面,瑞虎3x經歷了全球極限環境的苛刻路試,通過了近100項試驗驗證,開發過程中總計投入試驗車超過200台,累計行駛里程數約110萬公里;百公里綜合油耗僅5.9L,燃油經濟性十分突出。瑞虎3x大量選用環保材料技術,在零件、系統、整車各個階段對內飾空氣質量層層監控,營造綠色、環保、低氣味的內飾空間。同時,瑞虎3x遵循五星安全標準設計,具有高強度車身結構和嚴謹的製造工藝,不僅擁有輕量化前防撞鋼樑、環護式四位一體安全氣囊的全方位被動安全配置,還配備了全方位倒車雷達+動態輔助倒車影像系統、全新ESC車身穩定系統、TpMS直接式胎壓監測、EBA剎車輔助控制系統、上坡輔助HHC等越級高科技主動安全配置,全方位保障用戶行車安全。在售後服務方面也擁有尊貴禮遇,可享受“3年10萬公里整車保修”的服務品質保障。

“4G全時互聯” 定義全新用車生活

對以“智趣”為靈魂的瑞虎3x來說,“4G全時互聯”的引入,成為瑞虎3x最受關注之處。在智能科技配置方面,瑞虎3x深諳年輕用戶對互聯的需求,搭載了Cloudrive2.0智雲互聯行車系統,不僅配備了4G極速wifi、VOS智能語音控制、語音導航、Carplay手機互聯、8寸超大高清彩屏、動態輔助倒車影像、GSI換擋提醒等多項同級別獨有配置,還配有定速巡航、伴我回家功能、后視鏡電加熱 、外后視鏡集成轉向燈、遙控鑰匙等人性化科技配置,樹立起小型SUV配置標杆。

汽車“雲”服務是未來汽車發展的趨勢,瞄準年輕用戶的瑞虎3x,此次聯手業界“語音怪獸”科大訊飛推出Cloudrive 2.0智能語音交互系統,是同級唯一擁有4G互聯功能的SUV。這套系統此前在艾瑞澤5車型上已經體現了強大的功能和互動便利性,此次更是不惜成本在原先版本上升級優化,打造出“中國最強”車載語音系統。

“能說話絕不動手”,瑞虎3x還突破性地迎來了人機之間的無障礙溝通。系統內置4G無線網卡、硬件採用2G DDR3/8G ROM雙核,可實現最快的瀏覽分享速度;雙麥語音降噪模塊、雲+端語音識別技術的應用,普通話識別率近100%,16種方言也能精準識別交互;On Cloud全網雲端在線服務,私人定製在線服務、海量數據支持等互聯體驗使人與機器的交流像人與人之間的“對話”,一舉顛覆傳統用車方式。

2.0發力 品牌年輕化築優勢

從小型SUV瑞虎3到緊湊型SUV瑞虎5,再到中級SUV瑞虎7……瑞虎3x的上市,將進一步完成奇瑞在SUV市場的全方位布局。瑞虎3x將與新瑞虎3一起組合“雙子星“,實現奇瑞在SUV市場實現更細分的市場覆蓋,形成個性鮮明、高低搭配的瑞虎家族產品矩陣。

從今年上市的艾瑞澤5、瑞虎7、瑞虎3x這三款奇瑞2.0產品可以看到,奇瑞在設計中摒棄了中庸的設計理念,採用了大量時尚、個性的元素,充分迎合年輕消費者的審美和喜好。在科技配置上,新一代車型增強了智能互聯功能,搭載了語音交互、雲端服務、內置4G網卡等配置,滿足年輕消費群體高度依賴互聯網的生活方式和出行需求。奇瑞把未來品牌和產品的主力目標人群鎖定為年輕人,品牌形象正在變得更加年輕、時尚、國際范。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

※回頭車貨運收費標準

聽說奧迪要找“新歡”?一汽只打算用硬實力說話

前有一汽-大眾奧迪佔盡先機,後有競爭對手環飼左右,前景如何,殊未可知。相比之下,顯然合作已近30年,彼此知根知底的一汽-大眾奧迪更為老練。從率先實現國產、開創軸距加長,到成為第一個突破“百萬”銷量的豪華車品牌,再到如今打出新能源、数字出行服務和未來營銷這三張牌,都掐住了奧迪未來的全球布局,在中國市場佔盡先機。

11月11日,上汽集團與奧迪汽車股份有限公司在德國沃爾夫斯堡簽署合作框架協議,雙方將成立股比對等的合資公司,共同生產和銷售奧迪相關車型。

上汽和奧迪要聯手的消息早已傳得沸沸揚揚,隨着這次緋聞被坐實,關於奧迪“移情別戀”、“紅杏出牆”、“二嫁上汽大眾”等一系列犀利點評便紛至沓來。

然而,就在大家為一汽-大眾奧迪未來處境擔憂的時候,劇情發生了驚天翻轉——首先在11月14日上汽發布與奧迪合作的公告中,上汽最後明確指出該合作事項存在不確定性,請投資者注意風險。可見,未來仍然存在較大變數,上汽和奧迪的聯姻走向如何尚未可知。

其次就在同一天,奧迪鄭重發出與一汽的未來10年合作計劃。雙方將在電動車、移動出行服務和数字化服務及市場銷售等諸多領域展開深入合作。相比於上汽公告的語焉不詳,這份聲明拳拳到肉,明晰直接得多。

如今中國豪華車市場競爭激烈,奧迪為了滿足戰略需求,在華謀求新的合作夥伴,這無可厚非。不過上汽和奧迪將以怎樣的方式合作、又得經歷怎樣的磨合模式都在摸索中,如何落子仍然舉棋不定,然而變化多端絞殺激烈的市場形勢卻未必給他們足夠的摸索時間。前有一汽-大眾奧迪佔盡先機,後有競爭對手環飼左右,前景如何,殊未可知。

相比之下,顯然合作已近30年,彼此知根知底的一汽-大眾奧迪更為老練。從率先實現國產、開創軸距加長,到成為第一個突破“百萬”銷量的豪華車品牌,再到如今打出新能源、数字出行服務和未來營銷這三張牌,都掐住了奧迪未來的全球布局,在中國市場佔盡先機。未來一汽-大眾奧迪還將國產5款奧迪e-tron車型,其中就包括在今年品牌峰會中被提及的續航里程超過500公里的純電動車型。

此外,奧迪也是最早將4S體系引入到中國市場的豪華品牌。一汽-大眾奧迪在華有近400萬用戶,堅實的群眾基礎和體系能力優勢,也是上汽在短期內無法複製的。

所以,對於一汽來說,奧迪即使找了個“新歡”,也根本構不成威脅,最多也就是一種激勵吧。比較,硬實力不是一天能練成的,領先者的地位也不是能被輕易撼動的。總是周遭再彩旗飄飄,家裡這桿指引方向的紅旗依舊屹立不倒。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

「持續集成實踐系列 」Jenkins 2.x 構建CI自動化流水線常見技巧

在上一篇文章中,我們介紹了Jenkins 2.x實現流水線的兩種語法,以及在實際工作中該如何選擇腳本式語法或聲明式語法。原文可查閱:「持續集成實踐系列」Jenkins 2.x 搭建CI需要掌握的硬核要點(一)

在使用傳統的Jenkins Web界面和項目時,比如自由風格類型的任務,我們對處理流程的控制能力是有限的。所採用的典型形式是任務鏈:任務完成后觸發其他的任務。或者我們可能會包括構建后處理,不管任務成功完成與否,總是去做一些類似發送通知的事情。

除了這些基本的功能外,還可以添加條件性構建步驟插件,通過基於單個或者多個條件的構建步驟來定義更加複雜的流程。但即便如此,相比於我們編寫程序時可以直接控制執行流程的方法,條件性構建步驟插件對流程的控制能力依然有限。

在本篇中,我們將聊一下,關於Jenkins流水線DSL語言所提供的用於控制流水線執行流程基本結構和一些常見技巧。

1. Pipeline流水線指令常見結構

正如在系列第一篇文章中介紹到的,Jenkins DSL採用的是Groovy腳本語言。這也意味着如果當你掌握了Groovy語言,可以按照需求在流水線中使用Groovy語言的結構和習慣用法,針對這一類使用者,通常會更傾向於用腳本式語法來實現流水線。但不管採用的是哪種語法,從流水線組成的角度來講,都是由一些不同指令+步驟構建結構化代碼塊。

對於腳本式流水線,基本結構如下:

node('worker'){
    stage('階段'){
        // DSL
    }
}

構建腳本式流水線常用的結構或者說代碼塊節點主要由nodestage兩個組成。

而,聲明式流水線基本結構構成環節相對要多一些,整理了一張圖如下:

需要劃一個重點:可以簡單理解node是用於腳本式流水線,而agent則是用於聲明式流水線。

Jenkins Pipeline支持的指令(常見):

指令名 說明 作用域
agent 指定流水線或特定階段在哪裡運行。 stage 或pipeline
environment 設置環境變量 stage或pipeline
tools 自動下載並安裝指定的工具,並將其加入到PATH變量中 stage或pipeline
input 暫停pipeline,提示輸入內容 stage
options 用來指定一些預定義選項 stage 或 pipeline
parallel 并行執行多個step stage
parameters 允許執行pipeline前傳入一些參數 pipeline
triggers 定義執行pipeline的觸發器 pipeline
when 定義階段執行的條件 stage
build 觸發其他的job steps

options Jenkins Pipeline常見配置參數:

參數名 說明 例子
buildDiscarder 保留最近歷史構建記錄的數量 buildDiscarder(logRotator(numToKeepStr: ’10’)
timestamps 添加時間戳到控制台輸出 timestamps()
disableConcurrentBuilds 阻止Jenkins併發執行同一個流水線 disableConcurrentBuilds()
retry pipeline發生失敗后重試次數 retry(4)
timeout pipeline運行超時時間 timeout(time:1, unit: ‘HOURS’)

示例:

pipeline{
    agent any
    options{
        buildDiscarder(logRotator(numToKeepStr: '10')
        timestamps()
        retry(3)
        timeout(time:1, unit: 'HOURS')
    }
    stages{
        stage('demo'){
            steps{
                sh 'echo hello'
            }
        }
    }
}

更多pipeline指令,可參見官方介紹:

https://www.jenkins.io/doc/book/pipeline/syntax/#

下述僅挑幾個常用的,用於流水線流程控制選項的指令項,介紹一些常用技巧。

2. 超時(Timeout)

這個timeout步驟允許限制等待某個行為發生時腳本所花費的時間。其語法相當簡單。示例如下:

timeout(time:60,unit:'SECONDS'){
    //該代碼塊中的過程被設置為超時
}

默認的時間單位是min。如果發生超時,該步驟就會拋出一個異常。如果異常沒有被處理,將導致整個流水線過程被中止。

通常推薦的做法是,在使用timeout對任何造成流水線暫停的步驟(如一個input步驟)進行封裝,這樣做的結果是,即使出現差錯導致在限定的時間內沒有得到期望的輸入,流水線也會繼續執行。

示例如下:

node{
    def response
    stage('input'){
        timeout(time:10,unit:'SECONDS'){
            response = input message :'Please Input User'
            parameters:[string(defaultValue:'mikezhou',description:'Enter UserId:',name:'userid')]
        }
        echo "Username = " + response
    }
}

在這種情況下,Jenkins將會給用戶10s做出反應,如果時間到了,Jenkins會拋出一個異常來中止流水線。

如果實際在設計流水線時,當超時發生時,並不想中止流水線向下執行,可以引入try...catch代碼塊來封裝timeout。

如下代碼塊所示:

node{
    def response
    stage('input')
{
      try {
        timeout(time:10,unit:'SECONDS'){
            response = input message :'Please Input User'
            parameters:[string(defaultValue:'mikezhou',description:'Enter UserId:',name:'userid')]
         }
       }
       catch(err){
            response = 'user1'
      }
    }
}

需要注意的是,在處理異常的時候,可以在捕獲異常處設置為期望的默認值。

3. 重試(retry)

這個retry閉包將代碼封底裝為一個步驟,當代碼中有異常發生時,該步驟可以重試n次。其語法如下:

retry(n){
  //代碼過程
}

如果達到重試的限制並且發生了一個異常,那麼整個過程將會被中止(除非異常被處理,如使用try...catch代碼塊)

retry(2){
    try {
       def result=build job: "test_job"
       echo result
      }
    catch(err){
        if(!err.getMessage().contains("UNSTABLE"))
        throw err
    }
}

4. 等待直到(waitUntil)

引入waitUntil步驟,會導致整個過程一直等待某件事發生,通常這裏的“某件事”指的是可以返回true的閉包。

如果代碼過程永不返回true的話,這個步驟將會無期限地等待下去而不會結束。所以一般常見的做法,會結合timeout步驟來封裝waitUntil步驟。

例如,使用waitUntil代碼塊來等待一個標記文件出現:

timeout(time:15,unit:'SECONDS'){
    waitUntil{
        def ret = sh returnStatus:true,script:'test -e /home/jenkins2/marker.txt'
        return (ret==0)
    }
}

再舉一個例子,假如我們要等待一個Docker容器運行起來,以便我們可以在流水線中通過REST API調用獲取一些數據。在這種情況下,如果這個URL還不可用,就會得到一個異常。為了保證異常被拋出的時候進程不會立即退出,我們可以使用try...catch代碼塊來捕獲異常並且返回false。

timeout(time:150,unit:'SECONDS'){
    waitUntil{
        try{
            sh "docker exec ${containerid} curl --silent http://127.0.0.1:8080/api/v1/registry >/test/output/url.txt"
            return true
        }
        catch(err)
            return false
    }
}

5.Stash暫存:實現跨節點文件共享

在Jenkins的DSL中,stashunstash函數允許在流水線的節點間和階段間保存或獲取文件。

基本用法格式:

stash name:"<name>" [includes:"<pattern>" excludes:"<pattern>"]
unstash "<name>"

我們通過名稱或模式來指定一個被包括或被排除的文件的集合。給這些文件的暫存處命名,以便後面通過這個名稱使用這些文件。

提到stash,很多讀者可能會把Jenkins stashGit stash功能弄混,需要說明一下,Jenkins stashGit stash功能是不同的。Git stash函數是為了暫存一個工作目錄的內容,緩存那些還沒有提交到本地代碼倉庫的代碼。而Jenkins stash函數是為了暫存文件,以便在節點間共享。

例如,master節點和node節點,實現跨主機共享文件:

pipeline{
    agent none
    stages{
        stage('stash'){
            agent { label "master" }
            steps{
                writeFile file: "test.txt", text: "$BUILD_NUMBER"
                stash name: "test", includes: "test.txt"
            }
        }
        stage('unstash'){
            agent { label "node" }
            steps{
                script{
                    unstash("test")
                    def content = readFile("test.txt")
                    echo "${content}"
                }
            }
        }
    }
}

如果你覺得文章還不錯,請大家點贊分享下。你的肯定是我最大的鼓勵和支持。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

【大廠面試04期】講講一條MySQL更新語句是怎麼執行的?

在面試中,經常會問到在MySQL中一條更新語句是怎麼執行的?在本文中,我們就來詳細學習一下更新語句的執行流程,也有利於我們在工作中更好地使用MySQL。

流程圖

這是在網上找到的一張流程圖,寫的比較好,大家可以先看圖,然後看詳細閱讀下面的各個步驟。

執行流程:

1.連接驗證及解析

客戶端與MySQL Server建立連接,發送語句給MySQL Server,接收到後會針對這條語句創建一個解析樹,然後進行優化,(解析器知道語句是要執行什麼,會評估使用各種索引的代價,然後去使用索引,以及調節表的連接順序)然後調用innodb引擎的接口來執行語句。

2.寫undo log

innodb 引擎首先開啟事務,對舊數據生成一個UPDATE的語句(如果是INSERT會生成UPDATE語句),用於提交失敗后回滾,寫入undo log,得到回滾指針,並且更新這個數據行的回滾指針和版本號(會設置為更新的事務id)。

3.從索引中查找數據

根據查詢條件去B+樹中找到這一行數據(如果是唯一性索引,查到第一個數據就可以了(因為有唯一性約束),如果是普通索引,會把所有數據查找出來。)

4.更新數據

首先判斷數據頁是否在內存中?

4.1 如果數據頁在內存中

先判斷更新的索引是普通索引還是唯一性索引?

4.1.1 普通索引

如果更新的索引是普通索引,直接更新內存中的數據頁

4.1.2 唯一性索引

如果更新的索引是唯一性索引,判斷更新后是否會破壞數據的唯一性,不會的話就更新內存中的數據頁。

4.2 如果數據頁不在內存中

先判斷更新的索引是普通索引還是唯一性索引?

4.2.1 普通索引

如果是更新的索引是普通索引,將對數據頁的更新操作記錄到change buffer,change buffer會在空閑時異步更新到磁盤。

4.2.2 唯一性索引

如果是更新的索引是唯一性索引,因為需要保證更新后的唯一性,所以不能延遲更新,必須把數據頁從磁盤加載到內存,然後判斷更新后是否會數據衝突,不會的話就更新數據頁。

5.寫undo log(prepare狀態)

將對數據頁的更改寫入到redo log,將redo log設置為prepare狀態。

6.寫bin log(commit狀態),提交事務

通知MySQL server已經更新操作寫入到redo log 了,隨時可以提交,將執行的SQL寫入到bin log日誌,將redo log改成commit狀態,事務提交成功。(一個事務是否執行成功的判斷依據是是否在bin log中寫入成功。寫入成功后,即便MySQL Server崩潰,之後恢復時也會根據bin log, redo log進行恢復。具體可以看看下面的崩潰恢復原則)

補充資料:

二段提交制是什麼?

更新時,先改內存中的數據頁,將更新操作寫入redo log日誌,此時redo log進入prepare狀態,然後通知MySQL Server執行完了,隨時可以提交,MySQL Server將更新的SQL寫入bin log,然後調用innodb接口將redo log設置為提交狀態,更新完成。
如果只是寫了bin log就提交,那麼忽然發生故障,主節點可以根據redo log恢複數據到最新,但是主從同步時會丟掉這部分更新的數據。
如果只是寫binlog,然後寫redo log,如果忽然發生故障,主節點根據redo log恢複數據時就會丟掉這部分數據。
MySQL崩潰后,事務恢復時的判斷規則是怎麼樣的?(以redolog是否commit或者binlog是否完整來確定)
如果 redo log 裏面的事務是完整的,也就是已經有了 commit 標識,則直接提交;

如果 redo log 裏面的事務只有完整的 prepare,則判斷對應的事務 binlog 是否存在並完整:a. 如果是,則提交事務;b. 否則,回滾事務。

undo log是什麼?

undo log主要是保證事務的原子性,事務執行失敗就回滾,用於在事務執行失敗后,對數據回滾。undo log是邏輯日誌,記錄的是SQL。(可以認為當delete一條記錄時,undo log中會記錄一條對應的insert記錄,反之亦然,當update一條記錄時,它記錄一條對應相反的update記錄。)
在事務提交后,undo log日誌不會立即刪除,會放到一個待刪除的鏈表中,有purge線程判斷是否有其他事務在使用上一個事務之前的版本信息,然後決定是否可以清理,簡單的來說就是前面的事務都提交成功了,這些undo才能刪除。
change buffer是什麼(就是將更新數據頁的操作緩存下來)
在更新數據時,如果數據行所在的數據頁在內存中,直接更新內存中的數據頁。
如果不在內存中,為了減少磁盤IO的次數,innodb會將這些更新操作緩存在change buffer中,在下一次查詢時需要訪問這個數據頁時,在執行change buffer中的操作對數據頁進行更新。
適合寫多讀少的場景,因為這樣即便立即寫了,也不太可能會被訪問到,延遲更新可以減少磁盤I/O,只有普通索引會用到,因為唯一性索引,在更新時就需要判斷唯一性,所以沒有必要。

redo log 是什麼?

redo log就是為了保證事務的持久性。因為change buffer是存在內存中的,萬一機器重啟,change buffer中的更改沒有來得及更新到磁盤,就需要根據redo log來找回這些更新。
優點是減少磁盤I/O次數,即便發生故障也可以根據redo log來將數據恢復到最新狀態。
缺點是會造成內存臟頁,後台線程會自動對臟頁刷盤,或者是淘汰數據頁時刷盤,此時收到的查詢請求需要等待,影響查詢。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

※回頭車貨運收費標準

MongoDB 4.X CRUD基本操作

本文總結了MongoDB 4.X在mongo shell客戶端涉及的對文檔一些基本的增刪改查操作,即CRUD操作。主要結合了自己平時使用MongoDB的操作命令,更詳細的命令可以參考官方文檔: https://docs.mongodb.com/manual/crud/

創建(Create Operations)

創建(Create Operations)也叫插入操作,當集合不存在時,插入操作同時也會創建集合。MongoDB提供以下幾種插入文檔方法:

  • db.collection.insert():在指定集合中插入單個或多個文檔。
  • db.collection.insertOne():在指定集合中插入單個文檔(版本3.2新增)。
  • db.collection.insertMany():在指定集合中插入多個文檔(版本3.2新增)。

db.collection.insert()

在平時的使用當中,db.collection.insert()是我用得最多的文檔插入方式,具體的語法格式如下:

db.collection.insert(
   <document or array of documents>,
   {
     writeConcern: <document>,
     ordered: <boolean>
   }
)

參數說明:

  • document:指定一個或多個文檔;
  • writeConcern:文檔寫入確認級別(可選),關於讀寫策略確認級別,以後再進行討論;
  • ordered:指定文檔是否按順序插入(可選),默認為true;
    • 當指定為true時,插入多個文檔時將文檔排序保存在一個數組中進行插入,如果其中有一個文檔插入失敗,則會導致數組中餘下的文檔不進行插入操作;
    • 當指定為false時,插入多個文檔時將文檔不進行排序保存在一個數組中進行插入,如果其中有一個文檔插入失敗,則不影響數組中餘下的文檔進行插入操作。

如果插入的文檔當中沒有指定_id字段,則MongoDB會自動為文檔生成具有唯一ObjectId值的字段_id

使用示例:

// 沒有指定_id字段的插入單個文檔
db.products.insert( { item: "card", qty: 15 } );

// 指定_id字段的插入單個文檔
db.products.insert( { _id: 10, item: "box", qty: 20 } );

// 插入多個文檔,不進行排序,多個文檔包含在數組[]中
db.products.insert(
   [
     { _id: 11, item: "pencil", qty: 50, type: "no.2" },
     { item: "pen", qty: 20 },
     { item: "eraser", qty: 25 }
   ]
);

// 插入多個文檔,並進行排序
db.products.insert(
   [
     { _id: 20, item: "lamp", qty: 50, type: "desk" },
     { _id: 21, item: "lamp", qty: 20, type: "floor" },
     { _id: 22, item: "bulk", qty: 100 }
   ],
   { ordered: false }
);

db.collection.insertOne()

語法格式如下:

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

參數說明:

參考db.collection.insert()的參數說明。

使用示例:

// 單行插入文檔,關於_id字段指定與否也與db.collection.insert()一致
db.products.insertOne( { item: "card", qty: 15 } );

db.collection.insertMany()

語法格式如下:

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

參數說明:

參考db.collection.insert()的參數說明。

使用示例:

參考db.collection.insert()的參數說明。

關於返回確認信息

db.collection.insert()在插入文檔成功之後返回的信息相對較為簡潔:

db.products.insert( { item: "card", qty: 15 } );
WriteResult({ "nInserted" : 1, "writeConcernError" : [ ] })

db.collection.insertOne()db.collection.insertMany()返回的信息較為詳細:

db.products.insertOne( { item: "card", qty: 15 } );
{
    "acknowledged": true,
    "insertedId": ObjectId("5eccbd214139000074003be8")
}

db.products.insertMany( [
      { _id: 10, item: "large box", qty: 20 },
      { _id: 11, item: "small box", qty: 55 },
      { _id: 12, item: "medium box", qty: 30 }
   ] );
{
    "acknowledged": true,
    "insertedIds": [
        10,
        11,
        12
    ]
}

查詢(Read Operations)

查詢(Read Operations)讀操作,是對集合中已存在的文檔進行查詢,即對應關係型數據庫當中的select操作,比如MySQL,MongoDB提供以下幾種主要查詢文檔方法:

  • db.collection.find():查詢指定集合中滿足條件的一個或多個文檔和視圖;
  • db.collection.findOne():查詢指定集合中滿足條件的第一個文檔,並以格式化方式展現,通過pretty()方法。

來自官方文檔的測試數據:

db.inventory.insertMany([
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

db.collection.find()

db.collection.find()可以說是使用頻率最高的方法了,可以用來查詢數據庫集合當中的文檔。

語法格式如下:

db.collection.find(<query>, <projection>)
  • query:查詢表達式;
  • projection:指定查詢結果集中需要显示的字段。
    • Col_name:1|true 代表显示該字段;
    • Col_name:0 | false 代表不显示該字段。

_id字段是默認显示的,如果不想显示,則顯式指定{"_id" : 0}

查詢所有文檔:

db.inventory.find()

db.inventory.find({})

db.collection.findOne()

db.collection.findOne()方法显示符合條件查詢的第一條文檔,接受的參數與db.collection.find()方法一致。

條件查詢操作符

通常對文檔的查詢,是需要帶條件的,而很少使用到不帶條件的全文檔檢索,以下總結了幾種常使用的查詢操作符:

比較操作符

比較操作符涉及的操作如下錶所示:

名稱 說明
$eq 與指定值相等
$gt 大於指定的值
$gte 大於或等於指定的值
$in 指定的值在數組中
$lt 小於指定的值
$lte 小於或等於指定的值
$ne 所有不等於指定的值
$nin 指定的值不在數組中

使用示例:

// $eq:等值查詢 SQL: SELECT * FROM inventory WHERE status = "D";
db.inventory.find( { status: "D" } )

// $ne 同$eq

// $gt:範圍查詢(以大於為例) SQL: SELECT * FROM inventory WHERE qty > 30;
db.inventory.find( { qty: { $gt: 30 } } )

// $gte、$lt、$lte 同$gt

// $in:或查詢,可使用or代替 SQL: SELECT * FROM inventory WHERE status in ("A", "D")
db.inventory.find( { status: { $in: [ "A", "D" ] } } )

// $nin 同$in

邏輯操作符

邏輯操作符涉及的操作如下錶所示:

名稱 說明
$and 指定查詢同時滿足多個條件查詢子句
$not 指定查詢不滿足條件查詢子句
$nor 指定查詢無法滿足多個條件查詢子句
$or 指定查詢滿足其中某個條件查詢子句

使用示例:

// $and: 邏輯與查詢 SQL: SELECT * FROM inventory WHERE status = "A" AND qty < 30;
db.inventory.find( { $and: [ { status: { $eq: "A" },  qty: { $lt: 30 } } ] } )

// $not: 不符合查詢 SQL: SELECT * FROM inventory WHERE status <> "A";
db.inventory.find( { status: { $not: { $eq: "A" } } } )

/*
$nor: 無法同時滿足多個條件查詢,字段不存在時也符合 SQL: SELECT * FROM inventory WHERE status <> "A" AND qty > 30; 
符合以下條件之一都會出現在結果集中:
1.文檔包含status和qty字段並且符合條件;
2.文檔包含status字段並且符合條件,不包含qty字段;
3.文檔不包含status字段,包含qty字段並且符合條件;
4.文檔不包含status字段和qty字段。
*/
db.inventory.find( { $nor: [ { status: { $eq: "A" } },  { qty: { $lt: 30 } } ] } )

// $or: 邏輯或查詢 SQL: SELECT * FROM inventory WHERE status = "A" OR qty < 30;
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

元素操作符

元素操作符主要涉及的操作如下錶所示:

名稱 說明
$exists 指定查詢文檔是否有對應的字段
$type 指定查詢文檔的某個字段是否是對應類型

使用示例:

// $exists: 是否存在指定字段查詢
db.inventory.find( { price: { $exists: true } } )

// $type: 字段是否是指定類型查詢
db.inventory.find( { "qty": { $type: "double" } } )

評估操作符

評估操作符主要涉及的操作如下錶所示,更多操作符可以參考官方文檔:https://docs.mongodb.com/manual/reference/operator/query-evaluation/

名稱 說明
$expr 為同一個文檔中的字段指定表達式並且符合條件的查詢,比如比較同一文檔當中兩個字段的值
$mod 為字段值取模並且符合條件的查詢

為了更好的使用這兩個主要的操作符,額外創建個文檔:

db.monthlyBudget.insertMany([
    { "_id" : 1, "category" : "food", "budget": 400, "spent": 450 },
    { "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 },
    { "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 },
    { "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 },
    { "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
]);

使用示例:

// $expr: 允許使用聚合表達式,這裏以$gt為例,更多表達式參考 https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#aggregation-expressions
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )

// $mod: 對字段所在值進行取模運算,显示符合條件的查詢,如qty字段值對4取模,並且餘數為0
db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )

更新(Update Operations)

更新(Update Operations)是對已存在的文檔進行修改操作,MongoDB提供以下幾種主要更新文檔方法:

  • db.collection.update():更新或替換集合中符合條件的一個或多個文檔;
  • db.collection.updateOne():只更新集合中符合條件的第一個文檔,即使有多個文檔(版本3.2新增);
  • db.collection.updateMany():更新集合中所有符合條件的文檔(版本3.2新增)。

db.collection.update()

根據update指定的表達式可以修改文檔中符合條件的字段或代替整個文檔。具體的語法格式如下:

db.collection.update(
   <query>,   //查詢表達式
   <update>,  //更新表達式
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>                   // 版本4.2新增
   }
)

參數說明:

  • query:更新文檔的查詢表達式;如果指定了參數upsert: true並且集合中沒有符合查詢條件的文檔,查詢條件中有關於字段_id指定了.分隔符的,並不會插入新的文檔;

  • update:主要包含三種格式

    • 1.更新文檔:只包含更新操作符表達式;
    • 2.替換文檔:只包含<field1>: <value1>對;
    • 3.聚合管道:版本4.2新增,詳細參考官方文檔。
  • upsert:當query查詢條件沒符合更新的文檔,就新創建文檔(可選),默認值為false

  • multi:是否更新多個符合條件的文檔(可選),默認值為false,只更新符合條件的第一個文檔;

  • writeConcern:參考db.collection.insert()相同參數說明;

  • collation:指定校對規則(可選,版本3.4新增);

  • arrayFilters:文檔數組更新過濾操作符(可選,版本3.6新增);

    詳細參考:https://docs.mongodb.com/manual/reference/method/db.collection.update/#specify-arrayfilters-for-array-update-operations

  • hint:採用文檔或字符串的形式指定適用於查詢表達式的索引,如果索引不存在則報錯(可選,版本4.2新增)。

使用示例:

使用示例將通過使用兩種場景進行,一是沒有使用參數選項upsert,二是使用參數選項upsert

  • 不使用選項upsert
// 測試數據
db.books.remove({});

db.books.insertMany([
  {
    "_id" : 1,
    "item" : "TBD",
    "stock" : 0,
    "info" : { "publisher" : "1111", "pages" : 430 },
    "tags" : [ "technology", "computer" ],
    "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
    "reorder" : false
   },
   {
    "_id" : 2,
    "item" : "XYZ123",
    "stock" : 15,
    "info" : { "publisher" : "5555", "pages" : 150 },
    "tags" : [ ],
    "ratings" : [ { "by" : "xyz", "rating" : 5 } ],
    "reorder" : false
   }
]);


/* 使用選項參數 upsert: true
1、如果查詢表達式找到匹配的文檔,則執行更新操作;
2、如果查詢表達式沒有找到匹配的文檔,則執行插入操作;
*/
db.books.update(
   { item: "ZZZ135" },   // 查詢表達式
   {                     // 更新或替換文檔
     item: "ZZZ135",
     stock: 5,
     tags: [ "database" ]
   },
   { upsert: true }
);

// 1.使用更新操作表達式
/* $set操作符
1、查詢表達式指定需要更新的文檔 _id;
2、$inc操作符: stock的字段值+5;
3、$set操作符: 替換item字段值,替換嵌入文檔info的publisher字段值,替換tags字段值,替換數組ratings的第二個元素值
*/
db.books.update(
   { _id: 1 },
   {
     $inc: { stock: 5 },
     $set: {
       item: "ABC123",
       "info.publisher": "2222",
       tags: [ "software" ],
       "ratings.1": { by: "xyz", rating: 3 }
     }
   }
);
更新之後的文檔:
{

  "_id" : 1,
  "item" : "ABC123",
  "stock" : 5,
  "info" : { "publisher" : "2222", "pages" : 430 },
  "tags" : [ "software" ],
  "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],
  "reorder" : false
}

// 2.為已存在的數組添加元素
// $push操作符: 為指定文檔數組ratings添加一個元素
db.books.update(
   { _id: 2 },
   {
     $push: { ratings: { "by" : "jkl", "rating" : 2 } }
   }
);
更新之後的文檔:
{
  "_id" : 2,
  "item" : "XYZ123",
  "stock" : 15,
  "info" : {
   "publisher" : "5555",
   "pages" : 150
  },
  "tags" : [ ],
  "ratings" : [
   { "by" : "xyz", "rating" : 5 },

   { "by" : "jkl", "rating" : 2 }

  ],
  "reorder" : false
 }

// 3.文檔移除字段
// $unset操作符: 移除文檔的指定字段,為_id:1文檔移除tags字段
db.books.update( { _id: 1 }, { $unset: { tags: 1 } } );
更新后的文檔:
{
  "_id" : 1,
  "item" : "TBD",
  "stock" : 0,
  "info" : {
   "publisher" : "1111",
   "pages" : 430
  },
  "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
  "reorder" : false
 }

// 4.替換整個文檔
// 替換_id:2的文檔
db.books.update(
   { _id: 2 },
   {
     item: "XYZ123",
     stock: 10,
     info: { publisher: "2255", pages: 150 },
     tags: [ "baking", "cooking" ]
   }
);
更新后的文檔:
{
   "_id" : 2,
   "item" : "XYZ123",
   "stock" : 10,
   "info" : { "publisher" : "2255", "pages" : 150 },
   "tags" : [ "baking", "cooking" ]
}

// 5.更新多個文檔
db.books.update(
   { stock: { $lte: 10 } },
   { $set: { reorder: true } },
   { multi: true }
);
更新后的全部文檔:
[
  {
    "_id" : 1,
    "item" : "ABC123",
    "stock" : 5,
    "info" : {
     "publisher" : "2222",
     "pages" : 430
    },
    "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],

    "reorder" : true

   }
   {
     "_id" : 2,
     "item" : "XYZ123",
     "stock" : 10,
     "info" : { "publisher" : "2255", "pages" : 150 },
     "tags" : [ "baking", "cooking" ],

     "reorder" : true

   }
]
  • 使用upserts選項
/* 使用選項參數 upsert: true
1、如果查詢表達式找到匹配的文檔,則執行更新操作;
2、如果查詢表達式沒有找到匹配的文檔,則執行插入操作;
*/

// 1.插入未符合更新條件的文檔
db.books.update(
   { item: "ZZZ135" },   
   {                     
     item: "ZZZ135",
     stock: 5,
     tags: [ "database" ]
   },

   { upsert: true }      

);
因為集合併未滿足條件的文檔,則插入的文檔為:
{
  "_id" : ObjectId("5da78973835b2f1c75347a83"),
  "item" : "ZZZ135",
  "stock" : 5,
  "tags" : [ "database" ]
}

// 2.插入未符合更新條件並且基於更新操作符的文檔
// 如果沒有符合更新查詢條件,並且使用的是更新操作符,則會基於當前的查詢條件和更新操作符字段插入新的文檔
db.books.update(
   { item: "BLP921" },   
   {                     
      $set: { reorder: false },
      $setOnInsert: { stock: 10 }
   },
   { upsert: true }      
);
新插入的文檔為:
{
  "_id" : ObjectId("5da79019835b2f1c75348a0a"),
  "item" : "BLP921",
  "reorder" : false,
  "stock" : 10
}

// 3.插入未符合更新條件並且基於聚合管道的文檔
// 關於聚合管道請參考官方文檔:https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-with-aggregation-pipeline

// 4.插入未符合更新條件並且同時聯合多文檔操作符的文檔
如果不符合查詢條件,則只會插入單個文檔
db.books.update(
  { "info.publisher": "Self-Published" },   
  {                                         
    $set: { reorder: false, tags: [ "literature", "hardcover" ], stock: 25 }
  },
  { upsert: true, multi: true }             
);
新插入的文檔:
{
  "_id" : ObjectId("5db337934f670d584b6ca8e0"),
  "info" : { "publisher" : "Self-Published" },
  "reorder" : false,
  "stock" : 25,
  "tags" : [ "literature", "hardcover" ]
}

db.collection.updateOne()

根據update指定的參數可以修改文檔中符合條件的字段或代替整個文檔,與db.collection.update()不同的是每次只更新單個文檔。

語法格式如下:

db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        
   }
)

參數說明:

參考db.collection.update()的參數說明。

使用示例:

// 參考db.collection.update()

db.collection.updateMany()

根據update指定的參數可以修改文檔中符合條件的字段或代替整個文檔,與db.collection.updateOne()不同的是更新所有符合條件的文檔。

語法格式如下:

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        
   }
)

參數說明:

參考db.collection.update()的參數說明。

使用示例:

// 參考db.collection.update()

刪除(Delete Operations)

刪除是指對集合當中已存在的文檔進行清除操作,MongoDB提供以下幾種主要刪除文檔方法:

  • db.collection.deleteOne():只刪除集合中符合條件的一個文檔;
  • db.collection.deleteMany():刪除集合中所有符合條件的文檔;
  • db.collection.remove():刪除集合中符合條件的一個或多個文檔。

db.collection.deleteOne()

根據filter選項條件刪除集合中的單個文檔,具體語法格式如下:

db.collection.deleteOne(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

參數說明:

  • filter:指定基於查詢表達式的過濾條件,關於查詢表達式可以查看db.collecion.find()中的<query>
  • writeConcern:參考db.collection.insert()相同參數說明;
  • collation:指定校對規則(可選,版本3.4新增);

使用示例:

// 刪除指定條件的單個文檔
db.orders.deleteOne( { "_id" : 1 } );
{ "acknowledged" : true, "deletedCount" : 1 }

db.collection.deleteMany()

根據filter選項條件刪除集合中的單個文檔,具體語法格式如下:

db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

參數說明:

參考db.collection.deleteOne()的參數說明。

使用示例:

// 刪除指定條件的多個文檔
db.orders.deleteMany( {"cust_id" : "Cam Elot"} );
{ "acknowledged" : true, "deletedCount" : 2 }

注意: 如果是對固定集合進行刪除文檔操作則會報錯,固定集合的清除操作使用方法db.collection.drop()

總結

  1. 本文簡單梳理了在Mongo Shell下基本的CRUD操作,主要適用於DBA的運維管理,如果是研發同學,根據不同的編程語言使用不同客戶端驅動進行操作,詳細同樣可以參考官方文檔;
  2. 針對CRUD各個方面還有其他一些額外的方法,比如查詢修改文檔方法db.collection.findAndModify(),這裏只是總結每個文檔操作中一些最基礎的方法,對於額外高級的方法這裏不再贅述;
  3. 掌握了這些基本的CRUD操作,就可以對MongoDB文檔進行操作了,但還是需要控制好權限,畢竟數據安全不是小事,做變更之前做好數據的備份,以防萬一。

參考

https://docs.mongodb.com/manual/crud/

https://docs.mongodb.com/manual/reference/operator/query-evaluation/

https://docs.mongodb.com/manual/reference/method/db.collection.update/#specify-arrayfilters-for-array-update-operations

https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-with-aggregation-pipeline

〖本人水平有限,文中如有錯誤還請留言批評指正!〗

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

30萬以內教授看好的車型!但是它們都…

30萬以內更喜歡這些車型價格從低到高排列實際上,一輛車子賣不賣得好並不單單是車型本身的問題,4S店的門店數量、銷售的接待服務、售後管理都能直接影響到消費者的購車決定。作為一個“偽土豪”,周末的時間都會跑去4S店去看車。

平時看寫的導購文章已經夠多了,但是相信不少人還是選不到自己心儀的好車,這是正常的!市面上的車型選擇很多,一般面面俱到的車型價格都很貴,而我國汽車市場主要是集中在30萬這個區間內。有不少粉絲對的選車口味很感興趣,所以今天決定扒一扒30萬以內比較喜歡的車型,其實它們都是有一個共通點,那就是…

其實這是一個很普遍的現象,車評人眼中所看好的車型在市場上幾乎都是賣不好的貨色,而被我們黑就是垃圾的車型卻賣到瘋狂。原因很簡單,絕大部分消費者選車都偏向家用,選車需求:外觀要大氣、配置要高、空間要大、質量要穩定、操控是什麼?對於一個愛車之人,選車的要求則是:外觀帥、操控要好,動力要足、配置夠用就好、空間是什麼?兩種截然不同的選車理念已經決定車子賣得火不火的主要因素,畢竟“實用”才是眾多消費者的選擇,這才導致為什麼有這麼多“叫好不叫座”的車型出現。

30萬以內更喜歡這些車型

價格從低到高排列

實際上,一輛車子賣不賣得好並不單單是車型本身的問題,4S店的門店數量、銷售的接待服務、售後管理都能直接影響到消費者的購車決定。作為一個“偽土豪”,周末的時間都會跑去4S店去看車。跑得多你就能發現其實每一個品牌的4S店服務都有一定程度的差距,在必要的時候,還是會花錢買下來豐富一下自己家的車型庫(1:18模型)!

以所在的地區來說,在合資車型4S店中,個人感覺福特、別克的銷售一直都有着不錯的服務態度(基本的禮儀到位)、其次就是豐田、本田、大眾這一個檔次的,(看車的人比較多,銷售都沒空搭理你),最後就是馬自達這一類(看車的人沒幾個,但是銷售們也不會主動來搭理你)。

30萬以內,看上的車型其實不少!而今天說過的車型,除了宏光,其餘的都是賣不好的貨色,不過他們都有着各自的特點!高端品牌車型、改裝潛力極大的选手、駕控一流的选手,都是所喜愛的。不過為什麼不說SUV呢?因為中國SUV市場異常火爆,看上的SUV車型都賣得很好,就像昂科威、傳祺GS4、博越這一類的SUV都是很熱門的車型,是可以考慮的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準