SpringBoot之MongoTemplate的查詢可以怎么耍

學習一個新的數據庫,一般怎么下手呢?基本的CURD沒跑了,當可以熟練的增、刪、改、查一個數據庫時,可以說對這個數據庫算是入門了,如果需要更進一步的話,就需要了解下數據庫的特性,比如索引、事物、鎖、分布式支持等

本篇博文為mongodb的入門篇,將介紹一下基本的查詢操作,在Spring中可以怎么玩

原文可參看: 190113-SpringBoot高級篇MongoDB之查詢基本使用姿勢

I. 基本使用

0. 環境準備

在正式開始之前,先準備好環境,搭建好工程,對于這一步的詳細信息,可以參考博文: 181213-SpringBoot高級篇MongoDB之基本環境搭建與使用

接下來,在一個集合中,準備一下數據如下,我們的基本查詢范圍就是這些數據

data

1. 根據字段進行查詢

最常見的查詢場景,比如我們根據查詢user=一灰灰blog的數據,這里主要會使用Query + Criteria 來完成

@Component
public class MongoReadWrapper {private static final String COLLECTION_NAME = "demo";@Autowiredprivate MongoTemplate mongoTemplate;/*** 指定field查詢*/public void specialFieldQuery() {Query query = new Query(Criteria.where("user").is("一灰灰blog"));// 查詢一條滿足條件的數據Map result = mongoTemplate.findOne(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | specialFieldQueryOne: " + result);// 滿足所有條件的數據List<Map> ans = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | specialFieldQueryAll: " + ans);}
}

上面是一個實際的case,從中可以知道一般的查詢方式為:

  • Criteria.where(xxx).is(xxx)來指定具體的查詢條件
  • 封裝Query對象 new Query(criteria)
  • 借助mongoTemplate執行查詢 mongoTemplate.findOne(query, resultType, collectionName)

其中findOne表示只獲取一條滿足條件的數據;find則會將所有滿足條件的返回;上面執行之后,刪除結果如

query: Query: { "user" : "一灰灰blog" }, Fields: { }, Sort: { } | specialFieldQueryOne: {_id=5c2368b258f984a4fda63cee, user=一灰灰blog, desc=帥氣逼人的碼農界老秀}
query: Query: { "user" : "一灰灰blog" }, Fields: { }, Sort: { } | specialFieldQueryAll: [{_id=5c2368b258f984a4fda63cee, user=一灰灰blog, desc=帥氣逼人的碼農界老秀}, {_id=5c3afaf4e3ac8e8d2d39238a, user=一灰灰blog, desc=帥氣逼人的碼農界老秀3}, {_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}, {_id=5c3b003ee3ac8e8d2d39238f, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, sign=hello world}]

2. and多條件查詢

前面是只有一個條件滿足,現在如果是要求同時滿足多個條件,則利用org.springframework.data.mongodb.core.query.Criteria#and來斜街多個查詢條件

/*** 多個查詢條件同時滿足*/
public void andQuery() {Query query = new Query(Criteria.where("user").is("一灰灰blog").and("age").is(18));Map result = mongoTemplate.findOne(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | andQuery: " + result);
}

刪除結果如下

query: Query: { "user" : "一灰灰blog", "age" : 18 }, Fields: { }, Sort: { } | andQuery: {_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}

3. or或查詢

and對應的就是or,多個條件中只要一個滿足即可,這個與and的使用有些區別, 借助org.springframework.data.mongodb.core.query.Criteria#orOperator來實現,傳參為多個Criteria對象,其中每一個表示一種查詢條件

/*** 或查詢*/
public void orQuery() {// 等同于 db.getCollection('demo').find({"user": "一灰灰blog", $or: [{ "age": 18}, { "sign": {$exists: true}}]})Query query = new Query(Criteria.where("user").is("一灰灰blog").orOperator(Criteria.where("age").is(18), Criteria.where("sign").exists(true)));List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | orQuery: " + result);// 單獨的or查詢// 等同于Query: { "$or" : [{ "age" : 18 }, { "sign" : { "$exists" : true } }] }, Fields: { }, Sort: { }query = new Query(new Criteria().orOperator(Criteria.where("age").is(18), Criteria.where("sign").exists(true)));result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | orQuery: " + result);
}

執行后輸出結果為

query: Query: { "user" : "一灰灰blog", "$or" : [{ "age" : 18 }, { "sign" : { "$exists" : true } }] }, Fields: { }, Sort: { } | orQuery: [{_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b003ee3ac8e8d2d39238f, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, sign=hello world}]
query: Query: { "$or" : [{ "age" : 18 }, { "sign" : { "$exists" : true } }] }, Fields: { }, Sort: { } | orQuery: [{_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b003ee3ac8e8d2d39238f, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, sign=hello world}, {_id=5c3b0538e3ac8e8d2d392390, user=二灰灰blog, desc=帥氣逼人的碼農界老秀6, sign=hello world}]

4. in查詢

標準的in查詢case

/*** in查詢*/
public void inQuery() {// 相當于:Query query = new Query(Criteria.where("age").in(Arrays.asList(18, 20, 30)));List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | inQuery: " + result);
}

輸出

query: Query: { "age" : { "$in" : [18, 20, 30] } }, Fields: { }, Sort: { } | inQuery: [{_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}]

5. 數值比較

數值的比較大小,主要使用的是 get, gt, lt, let

/*** 數字類型,比較查詢 >*/
public void compareBigQuery() {// age > 18Query query = new Query(Criteria.where("age").gt(18));List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | compareBigQuery: " + result);// age >= 18query = new Query(Criteria.where("age").gte(18));result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | compareBigQuery: " + result);
}/*** 數字類型,比較查詢 <*/
public void compareSmallQuery() {// age < 20Query query = new Query(Criteria.where("age").lt(20));List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | compareSmallQuery: " + result);// age <= 20query = new Query(Criteria.where("age").lte(20));result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | compareSmallQuery: " + result);
}

輸出

query: Query: { "age" : { "$gt" : 18 } }, Fields: { }, Sort: { } | compareBigQuery: [{_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}]
query: Query: { "age" : { "$gte" : 18 } }, Fields: { }, Sort: { } | compareBigQuery: [{_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}]
query: Query: { "age" : { "$lt" : 20 } }, Fields: { }, Sort: { } | compareSmallQuery: [{_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}]
query: Query: { "age" : { "$lte" : 20 } }, Fields: { }, Sort: { } | compareSmallQuery: [{_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}]

6. 正則查詢

牛逼高大上的功能

/*** 正則查詢*/
public void regexQuery() {Query query = new Query(Criteria.where("user").regex("^一灰灰blog"));List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | regexQuery: " + result);
}

輸出

query: Query: { "user" : { "$regex" : "^一灰灰blog", "$options" : "" } }, Fields: { }, Sort: { } | regexQuery: [{_id=5c2368b258f984a4fda63cee, user=一灰灰blog, desc=帥氣逼人的碼農界老秀}, {_id=5c3afacde3ac8e8d2d392389, user=一灰灰blog2, desc=帥氣逼人的碼農界老秀2}, {_id=5c3afaf4e3ac8e8d2d39238a, user=一灰灰blog, desc=帥氣逼人的碼農界老秀3}, {_id=5c3afafbe3ac8e8d2d39238b, user=一灰灰blog4, desc=帥氣逼人的碼農界老秀4}, {_id=5c3afb0ae3ac8e8d2d39238c, user=一灰灰blog5, desc=帥氣逼人的碼農界老秀5}, {_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}, {_id=5c3b003ee3ac8e8d2d39238f, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, sign=hello world}]

7. 查詢總數

統計常用,這個主要利用的是mongoTemplate.count方法

/*** 查詢總數*/
public void countQuery() {Query query = new Query(Criteria.where("user").is("一灰灰blog"));long cnt = mongoTemplate.count(query, COLLECTION_NAME);System.out.println("query: " + query + " | cnt " + cnt);
}

輸出

query: Query: { "user" : "一灰灰blog" }, Fields: { }, Sort: { } | cnt 5

8. 分組查詢

這個對應的是mysql中的group查詢,但是在mongodb中,更多的是通過聚合查詢,可以完成很多類似的操作,下面借助聚合,來看一下分組計算總數怎么玩

/** 分組查詢*/
public void groupQuery() {// 根據用戶名進行分組統計,每個用戶名對應的數量// aggregate([ { "$group" : { "_id" : "user" , "userCount" : { "$sum" : 1}}}] )Aggregation aggregation = Aggregation.newAggregation(Aggregation.group("user").count().as("userCount"));AggregationResults<Map> ans = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);System.out.println("query: " + aggregation + " | groupQuery " + ans.getMappedResults());
}

注意下,這里用Aggregation而不是前面的QueryCriteria,輸出如下

query: { "aggregate" : "__collection__", "pipeline" : [{ "$group" : { "_id" : "$user", "userCount" : { "$sum" : 1 } } }] } | groupQuery [{_id=一灰灰blog, userCount=5}, {_id=一灰灰blog2, userCount=1}, {_id=一灰灰blog4, userCount=1}, {_id=二灰灰blog, userCount=1}, {_id=一灰灰blog5, userCount=1}]

9. 排序

sort,比較常見的了,在mongodb中有個有意思的地方在于某個字段,document中并不一定存在,這是會怎樣呢?

/*** 排序查詢*/
public void sortQuery() {// sort查詢條件,需要用with來銜接Query query = Query.query(Criteria.where("user").is("一灰灰blog")).with(Sort.by("age"));List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | sortQuery " + result);
}

輸出結果如下,對于沒有這個字段的document也被查出來了

query: Query: { "user" : "一灰灰blog" }, Fields: { }, Sort: { "age" : 1 } | sortQuery [{_id=5c2368b258f984a4fda63cee, user=一灰灰blog, desc=帥氣逼人的碼農界老秀}, {_id=5c3afaf4e3ac8e8d2d39238a, user=一灰灰blog, desc=帥氣逼人的碼農界老秀3}, {_id=5c3b003ee3ac8e8d2d39238f, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, sign=hello world}, {_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}]

10. 分頁

數據量多的時候,分頁查詢比較常見,用得多就是limit和skip了

/*** 分頁查詢*/
public void pageQuery() {// limit限定查詢2條Query query = Query.query(Criteria.where("user").is("一灰灰blog")).with(Sort.by("age")).limit(2);List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | limitPageQuery " + result);// skip()方法來跳過指定數量的數據query = Query.query(Criteria.where("user").is("一灰灰blog")).with(Sort.by("age")).skip(2);result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);System.out.println("query: " + query + " | skipPageQuery " + result);
}

輸出結果表明,limit用來限制查詢多少條數據,skip則表示跳過前面多少條數據

query: Query: { "user" : "一灰灰blog" }, Fields: { }, Sort: { "age" : 1 } | limitPageQuery [{_id=5c2368b258f984a4fda63cee, user=一灰灰blog, desc=帥氣逼人的碼農界老秀}, {_id=5c3afaf4e3ac8e8d2d39238a, user=一灰灰blog, desc=帥氣逼人的碼農界老秀3}]
query: Query: { "user" : "一灰灰blog" }, Fields: { }, Sort: { "age" : 1 } | skipPageQuery [{_id=5c3b003ee3ac8e8d2d39238f, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, sign=hello world}, {_id=5c3afb1ce3ac8e8d2d39238d, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=18.0}, {_id=5c3b0031e3ac8e8d2d39238e, user=一灰灰blog, desc=帥氣逼人的碼農界老秀6, age=20.0}]

11. 小結

上面給出的一些常見的查詢姿勢,當然并不全面,比如我們如果需要查詢document中的部分字段怎么辦?比如document內部結果比較復雜,有內嵌的對象或者數組時,嵌套查詢可以怎么玩?索引什么的又可以怎么利用起來,從而優化查詢效率?如何通過傳說中自動生成的_id來獲取文檔創建的時間戳?

先留著這些疑問,后面再補上

II. 其他

0. 項目

  • 工程:spring-boot-demo
  • module: mongo-template
  • 相關博文: 181213-SpringBoot高級篇MongoDB之基本環境搭建與使用

1. 一灰灰Blog

  • 一灰灰Blog個人博客 https://blog.hhui.top
  • 一灰灰Blog-Spring專題博客 http://spring.hhui.top

一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛

2. 聲明

盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

  • 微博地址: 小灰灰Blog
  • QQ: 一灰灰/3302797840

3. 掃描關注

一灰灰blog

QrCode

知識星球

goals

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

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

相關文章

這可能是我見過最詳細的快速排序!

關于快速排序&#xff0c;網上&#xff0c;和維基都有完成的解釋&#xff0c;他們都是。。。。。。&#xff0c;俺覺得都是&#xff0c;太過于總結話語在概述一些東西&#xff1b; 而我卻從最本質的東西&#xff0c;一步一步的深入&#xff1b;在深入的學習過程中&#xff0c;我…

LINQ to SQL 實現 GROUP BY、聚合、ORDER BY

前言 本示例主要實現 LINQ 查詢&#xff0c;先分組&#xff0c;再聚合&#xff0c;最后在排序。示例很簡單&#xff0c;但是使用 LINQ 卻生成了不同的 SQL 實現。 1) 采用手動編寫 SQL 實現 SELECT ROW_NUMBER() OVER(ORDER BY T.RealTotal DESC) AS SN, * FROM ( SELECT (S…

Mysql之事務

什么是事務 假如你下了一筆訂單&#xff0c;會有以下數據庫操作&#xff1a; 1. 生成一筆訂單記錄 2. 減少庫存 3. 從你的賬戶中減少金額 4. 生成支付記錄 這邊的四個操作缺一不可&#xff0c;一旦某一個操作出現異常&#xff0c;則全部操作都需要全部回滾。而事務的作…

JVM垃圾回收機制總結

對于垃圾回收機制我先拋出三個問題&#xff1a; ①哪些內存需要回收&#xff1f; ②什么時候回收&#xff1f; ③如何回收&#xff1f; 下面我們主要針對這三個問題來研究JVM GC 一、哪些內存需要回收&#xff1f; 1.JAVA使用可達性分析法來判斷對象是否需要回收。 這個算法的基…

虛擬機增加內存方法

樓主由于要在虛擬機里面裝一個oracle&#xff0c;在安裝過程中&#xff0c;提示物理內存不符合最低標準&#xff0c;如圖1. 圖1 因為懶得新建一個虛擬機了&#xff0c;所以考慮給虛擬機新增磁盤空間。 首先說明&#xff0c;新增磁盤空間&#xff0c;必須保證當前虛擬機里每個新…

myBatis xml if、where、if-else?、foreach 心得

MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗&#xff0c;你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格&#xff0c;還要注意去掉列表最后一個列名的逗號。利用動態 SQL 這一特性可以徹底擺脫這…

bzoj千題計劃213:bzoj2660: [Beijing wc2012]最多的方案

http://www.lydsy.com/JudgeOnline/problem.php?id2660 很容易想到是先把n表示成最大的兩個斐波那契數相加&#xff0c;然后再拆分這兩個斐波那契數 把數表示成斐波那契進制的形式&#xff0c;第i位表示有沒有第i個斐波那契數 比如16133 001001 那么拆分一個數就是把一個1…

面對對象-封裝

private 私有的 package/friendly/default 不寫 protected 受保護的 public 公共的 那么什么情況該用什么修飾符呢&#xff1f;從作用域來看&#xff0c;public能夠適用所有的情況。 但是大家在工作的時候&#xff0c;又不會真正全部都適用public,那么到底什么情況改用什么修飾…

本文詳解5G是個什么鬼,程序員都準備好了嗎?

無線移動通訊發展歷史 最近5G的概念炒的如火如荼&#xff0c;為此&#xff0c;華為和高通還干了一仗。這篇文章從技術層面給大家分析&#xff0c;什么是5G&#xff0c;它和4G比&#xff0c;高級在哪里&#xff1f; 我們來看看移動互聯網的技術發展&#xff1a; 然后我們在來看看…

安裝kerberos報錯 error: command 'gcc' failed with exit status 1

pip install kerberos 報錯&#xff1a;error: command gcc failed with exit status 1 安裝環境工具 yum install gcc libffi-devel python-devel openssl-devel 再次安裝kerberos安裝成功 轉載于:https://www.cnblogs.com/panbc/p/8268574.html

jquery正則表達式驗證:驗證全是數字

需求說明&#xff1a; 前端頁面使用正則表達式驗證輸入框中輸入的內容全是數字。 代碼說明&#xff1a; 這里只介紹正則表達式&#xff0c;其他部分的代碼不做介紹。如果有其他需要自行修改即可。 步驟一&#xff1a;建立一個頁面可以是html、jsp等&#xff0c;引入jquery-3.2.…

0613課堂匯總

一&#xff1a; 數據類型&#xff1a; 基本數據類型{byte(8)/short(16)/char(16)/int(32)/float(32)/long(64)/double(64)/boolean(1)}引用數據類型{*除了基本數據類型都是引用數據類型 *包括API中的類&#xff08;String,File&#xff09;*自定義的類&#xff08;Personal A…

Istio流量管理實踐之(5): 使用cert-manager部署Istio自定義入口網關及進行證書管理...

Istio Gateway提供多個自定義入口網關的支持能力&#xff0c;通過開放一系列端口用于承載網格邊緣的進入連接&#xff0c;同時可以使用不同loadbalancer來隔離不同的入口流量。cert-manager可用于使用存儲在Kubernetes Secret資源中的任意簽名密鑰對來獲取證書。本文提供了手動…

log4配置

log4j 和 log4j2 方式一&#xff1a;log4j2.xml 添加 jar 包 1 <!-- log4j-core --> 2 <!-- 3 <dependency> 4 <groupId>org.apache.logging.log4j</groupId> 5 <artifactId>log4j-core</artifactId> 6 …

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函數+多項式運算+FFT)

3625: [Codeforces Round #250]小朋友和二叉樹 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我們的小朋友很喜歡計算機科學&#xff0c;而且尤其喜歡二叉樹。考慮一個含有n個互異正整數的序列c[1],c[2],...,c[n]。…

常用內建模塊

一.datetime 1.模塊導入: from datetime import datetime 2.獲取當前日期和時間: >>> now datetime.now() >>> print(now) 2019-01-13 14:19:38.1810003.獲取指定日期和時間: >>> dt datetime(2019,1,10,15,0) >>> print(dt) 2019-01-10…

子序列進階問題

題目&#xff1a; 有一個數組&#xff0c;讓找到兩個不重復的連續子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定連續&#xff0c;設兩端連接處index為{X&#xff0c;x1}&#xff0c;X可取0~n-1 設F(x)為連接處index為{X&#xff0c;x1}時 Max(Sum(A)…

day5-shelve模塊

一、概述前面章節我們講述了json和pickle模塊的序列化和反序列化處理&#xff0c;他們有一個不足是在python 3中不能多次dump和load&#xff0c;shelve模塊則可以規避這個問題。shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊&#xff0c;可以持久化任何pickle可支持…

程序員:請你不要對業務「置之不理」

成長是條孤獨的路&#xff0c;一個人會走得更快&#xff1b;有志同道合者同行&#xff0c;會走得更遠。本篇內容整理自 21 天鯤鵬新青年計劃線上分享內容。鯤鵬新青年計劃是由 TGO 鯤鵬會組織的線上分享活動&#xff0c;希望能幫助更多同學一起學習、成長。12 月 28 日&#xf…

在Ubuntu系統下如何將chrome瀏覽器的bookmarks導出到本地

1. 打開chrome瀏覽器在頁面的右上角點擊那個三個小點的位置&#xff0c;找到bookmarks&#xff0c;然后點擊bookmarks manager,然后在organize右側大倒三角下選擇&#xff0c;export bookmarks to HTML&#xff0c;選擇要保存的位置&#xff0c;利用同樣的方法下次就可以直接導…