最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合MongoDB全過程

 更新時間:2024年05月29日 10:21:00   作者:一只咸魚。。  
這篇文章主要介紹了SpringBoot整合MongoDB全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、環(huán)境準(zhǔn)備

①添加 SpringData 依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

②配置 yml 文件,官方連接配置文檔

方式一:

spring:
  data:
    mongodb:
      uri: mongodb://root:123456@1.15.76.95:27017/library?authSource=admin

方式二:

spring:
  data:
    mongodb:
      username: root
      password: 123456
      host: 1.15.76.95
      port: 27017
      database: library
      authentication-database: admin

③直接注入 MongoTemplate 進(jìn)行操作

@Resource
MongoTemplate mongoTemplate;

二、集合操作

@Test
public void testCollection(){
	boolean exists = mongoTemplate.collectionExists("borrow");
	if(exists) {
		// 刪除集合
		mongoTemplate.dropCollection("borrow");
	}else {
		// 創(chuàng)建集合
		mongoTemplate.createCollection("borrow");
	}
	Set<String> collectionNames = mongoTemplate.getCollectionNames();
    System.out.println(collectionNames.toString());  // [borrow, book, user]
}

三、文檔操作

3.1 實體類

@Document

  • 修飾范圍:用在類上。
  • 作用:用來映射這個類的一個對象為 Mongo 中一條文檔數(shù)據(jù)。
  • 屬性:(value 、collection) 用來指定操作的集合名稱。

@MongoId

  • 修飾范圍:用在成員變量、方法上。
  • 作用:用來將成員變量的值映射為文檔的 _id 的值。

@Field

  • 修飾范圍:用在成員變量、方法上。
  • 作用:用來將成員變量及其值映射為文檔中一個 key:value 對。
  • 屬性:(name , value) 用來指定在文檔中 key 的名稱,默認(rèn)為成員變量名。

@Transient

  • 修飾范圍:用在成員變量、方法上。
  • 作用:用來指定此成員變量不參與文檔的序列化。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("user")
public class User {
    @MongoId
    private Integer uid;
    @Field
    private String name;
    @Field
    private String password;
    @Field
    private Integer age;
}

3.2 添加文檔

insert 方法返回值是新增的 Document 對象,里面包含了新增后 id 的值。

如果集合不存在會自動創(chuàng)建集合。

@Test
public void test1() {
    // _id存在時更新數(shù)據(jù)
    mongoTemplate.save(new User(1, "aaa", "123456", 20));
    // _id存在時拋出異常
    mongoTemplate.insert(new User(2, "bbb", "113456", 21));

    List<User> list = Arrays.asList(
            new User(3, "ccc", "124266", 22),
            new User(4, "ddd", "136521", 23),
            new User(5, "eee", "147258", 24));
    // 批量插入
    mongoTemplate.insert(list, User.class);
}

通過 Spring Data MongoDB 還會給集合中多加一個 _class 的屬性,存儲新增時 Document 對應(yīng) Java 中類的全限定路徑。

這么做為了查詢時能把 Document 轉(zhuǎn)換為 Java 類型。


3.3 查詢文檔

  • Query 類作為查詢條件的容器,用于放置 Criteria 條件接口。
  • Criteria 是標(biāo)準(zhǔn)查詢的接口,可以引用靜態(tài)的
  • Criteria.where() 將字段和條件組合在一起進(jìn)行查詢。
@Test
public void test1() {
	System.out.println("==========查詢所有文檔===========");
    List<User> list = mongoTemplate.findAll(User.class);
    list.forEach(System.out::println);

    System.out.println("==========根據(jù)_id查詢===========");
    User user = mongoTemplate.findById(3, User.class);
    System.out.println(user);

    System.out.println("==========findOne返回第一個文檔===========");
    User one = mongoTemplate.findOne(new Query(), User.class);
    System.out.println(one);
}
@Test
public void test2() {
	System.out.println("==========條件查詢===========");
	// 查詢name為"eee"的用戶
	Query query1 = new Query(Criteria.where("name").is("eee"));
	// 查詢 age<23 的用戶
	Query query2 = new Query(Criteria.where("age").lt(23));
	// 查詢 21<=age<24 的用戶
	Query query3 = new Query(Criteria.where("age").gte(21).lt(24));
	// 模糊查詢
	Query query4 = new Query(Criteria.where("password").regex("123"));

	System.out.println("==========多條件查詢===========");
	// 查詢 age<24 且 密碼包含"123" 的用戶
	Criteria criteria1 = new Criteria();
	criteria1.andOperator(Criteria.where("age").lt(24), Criteria.where("password").regex("123"));
	Query query5 = new Query(criteria1);
	// 查詢 age>23 或 密碼包含"456" 的用戶
	Criteria criteria2 = new Criteria();
	criteria2.orOperator(Criteria.where("age").gt(23), Criteria.where("password").regex("456"));
	Query query6 = new Query(criteria2);

	List<User> list = mongoTemplate.find(query6, User.class);
	list.forEach(System.out::println);
}
@Test
public void test3() {
	System.out.println("==========排序===========");
	Query query1 = new Query();
	query1.with(Sort.by(Sort.Order.desc("age")));

	System.out.println("==========分頁===========");
	Query query2 = new Query();
	query2.skip(0).limit(3);

	List<User> list = mongoTemplate.find(query2, User.class);
	list.forEach(System.out::println);
}

使用 JSON 字符串方式查詢:

@Test
public void testFindByJson() {
	// 等值查詢
	Query query1 = new BasicQuery("{name:'eee'}");
	// 多條件查詢
	Query query2 = new BasicQuery("{age:{$lt:24}, password:{$regex:'123'}}");
	Query query3 = new BasicQuery("{$or:[{age:{$gt:23}}, {password:{$regex:'456'}}]}");

	List<User> list = mongoTemplate.find(query3, User.class);
	list.forEach(System.out::println);
}

3.4 修改文檔

在 Mongodb 中無論是使用客戶端 API 還是使用 Spring Data,更新返回結(jié)果一定是受行數(shù)影響。如果更新后的結(jié)果和更新前的結(jié)果是相同,返回 0。

  • updateFirst():只更新滿足條件的第一條記錄。
  • updateMulti():更新所有滿足條件的記錄。
  • upsert():沒有符合條件的記錄則插入數(shù)據(jù)。
@Test
public void test1() {
	Query query = new Query(Criteria.where("name").is("eee"));
	Update update = new Update();
	update.set("age", 25);
	// updateFirst() 只更新滿足條件的第一條記錄
	UpdateResult updateResult = mongoTemplate.updateFirst(query, update, User.class);
	System.out.println("返回修改的記錄數(shù): " + updateResult.getModifiedCount());
}
@Test
public void test2() {
	Query query = new Query(Criteria.where("age").gt(23));
	Update update = new Update();
	update.inc("age", 1);
	// updateMulti() 更新所有滿足條件的記錄
    UpdateResult updateResult = mongoTemplate.updateMulti(query, update, User.class);
	System.out.println("返回修改的記錄數(shù): " + updateResult.getModifiedCount());
}
@Test
public void test3() {
	// query查詢結(jié)果不存在
	Query query = new Query(Criteria.where("name").is("ggg"));
	Update update = new Update();
	update.set("age", 28);
	update.setOnInsert("_id", 7); //不存在時插入
	// upsert() 沒有符合條件的記錄則插入數(shù)據(jù)
	UpdateResult updateResult = mongoTemplate.upsert(query, update, User.class);
	System.out.println("返回修改的記錄數(shù): " + updateResult.getModifiedCount());
}

3.5 刪除文檔

@Test
public void testDelete() {
	//刪除所有文檔, 不如用dropCollection()
	//mongoTemplate.remove(new Query(),Employee.class);
        
	//條件刪除
	Query query = new Query(Criteria.where("name").is("fff"));
	mongoTemplate.remove(query, User.class);
}

四、聚合操作

4.1 使用 Aggregation 實現(xiàn)

用 Aggregation 集合接收聚合操作,用 MongoTemplate 對象直接調(diào)用 aggregate,傳入聚合操作集合、表名、映射對象。

@Test
public void testAggregation() {
	// 1.先定義聚合操作
	MatchOperation match = Aggregation.match(Criteria.where("type").is("novel"));
	SortOperation sort = Aggregation.sort(Sort.Direction.ASC, "favCount");
	// 2.按順序組合每一個聚合步驟
	TypedAggregation<Book2> typedAggregation = Aggregation.newAggregation(Book2.class, match, sort);
	// 3.執(zhí)行聚合操作, 可以使用 Document、Map、自定義實體類 接收結(jié)果
	AggregationResults<Document> aggregate = mongoTemplate.aggregate(typedAggregation, Document.class);
	List<Document> results = aggregate.getMappedResults();
	results.forEach(System.out::println);
}

4.2 使用 Aggregates 實現(xiàn)

用 Aggregates 和 Bson 構(gòu)建聚合操作對象,用預(yù)先生成的 MongoCollection 對象調(diào)用 aggregate 執(zhí)行。

@Test
public void testAggregates(){
	// 1.先通過集合名拿到所有文檔
	MongoCollection<Document> collection = mongoTemplate.getCollection("book2");
	
	// 2.Aggregates提供各種聚合操作符,返回一個Bson對象
	Bson matchBson = Aggregates.match(new Document("type", "travel"));
//	Bson matchBson = Aggregates.match(Filters.eq("type", "travel"));//Filters來實現(xiàn)過濾
	Bson sortBson = Aggregates.sort(Sorts.ascending("favCount"));
//	Bson sortBson = Aggregates.sort(new Document("favCount", 1));
	
	// 3.構(gòu)建一個List<Bson>, 并把每一個聚合操作按順序加進(jìn)去
	List<Bson> bsonList = new ArrayList<>();
	bsonList.add(matchBson);
	bsonList.add(sortBson);
	
	// 4.最后傳入aggregate方法中執(zhí)行,并且接收結(jié)果集
	AggregateIterable<Document> resultList = collection.aggregate(bsonList);
	resultList.forEach(System.out::println);
}

示例一:統(tǒng)計文檔中的書籍總量、收藏總數(shù)、平均收藏量

@Test
public void test1() {
    MongoCollection<Document> collection = mongoTemplate.getCollection("book2");

    Bson groupBson = Aggregates.group(null,
            Accumulators.sum("bookCount", 1),
            Accumulators.sum("favCount", "$favCount"),
            Accumulators.avg("favAvg", "$favCount"));

    List<Bson> bsonList = new ArrayList<>();
    bsonList.add(groupBson);

    AggregateIterable<Document> resultList = collection.aggregate(bsonList);
    resultList.forEach(System.out::println);
}

示例二:統(tǒng)計tag標(biāo)簽的熱度排行 (根據(jù)favCount總量排行即為熱度)

@Test
public void test4() {
    MongoCollection<Document> collection = mongoTemplate.getCollection("book2");

    Bson unwindBson = Aggregates.unwind("$tag");
    Bson groupBson = Aggregates.group("$tag", Accumulators.sum("favCount", "$favCount"));
    Bson sortBson = Aggregates.sort(new Document("favCount", -1));

    List<Bson> bsonList = new ArrayList<>();
    bsonList.add(unwindBson);
    bsonList.add(groupBson);
    bsonList.add(sortBson);

    AggregateIterable<Document> resultList = collection.aggregate(bsonList);
    resultList.forEach(System.out::println);
}

4.3 應(yīng)用案例

示例一:統(tǒng)計每個作者的每本book的收藏數(shù)

@Test
public void test1() {
    GroupOperation group = Aggregation
            .group("$author.name", "$title")
            .sum("$favCount").as("favCount");
    TypedAggregation<Book2> typedAggregation = Aggregation.newAggregation(Book2.class, group);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(typedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

示例二:每個作者的book的tag合集

@Test
public void test2() {
	UnwindOperation unwind = Aggregation.unwind("$tag");
    GroupOperation group = Aggregation
            .group("$author.name")
            .addToSet("$type").as("types");
    TypedAggregation<Book2> typedAggregation = Aggregation.newAggregation(Book2.class, unwind, group);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(typedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

示例三:聯(lián)表查詢用戶以及對應(yīng)的訂單信息

@Test
public void test1() {
    LookupOperation lookup = Aggregation.lookup("order", "_id", "customerId", "order");
    TypedAggregation<Customer> orderTypedAggregation = Aggregation.newAggregation(Customer.class, lookup);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(orderTypedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

示例四:聯(lián)表查詢訂單信息以及對應(yīng)的商品項

@Test
public void test2() {
    LookupOperation lookup = Aggregation.lookup("orderItem", "_id", "orderId", "orderItem");
    TypedAggregation<Order> orderItemTypedAggregation = Aggregation.newAggregation(Order.class, lookup);
    AggregationResults<Document> aggregate = mongoTemplate.aggregate(orderItemTypedAggregation, Document.class);
    List<Document> mappedResults = aggregate.getMappedResults();
    mappedResults.forEach(System.out::println);
}

總結(jié)

本文是對MongoDB的學(xué)習(xí),SpringBoot整合MongoDB的SpringData,配置文件中如何連接,實體類如何映射到文檔,如何通過API進(jìn)行集合操作和文檔的增刪查改。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot?配置SqlSessionFactory方式

    Springboot?配置SqlSessionFactory方式

    這篇文章主要介紹了Springboot?配置SqlSessionFactory方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java swing實現(xiàn)音樂播放器桌面歌詞字體變色效果

    Java swing實現(xiàn)音樂播放器桌面歌詞字體變色效果

    這篇文章主要為大家詳細(xì)介紹了Java swing實現(xiàn)音樂播放器桌面歌詞字體變色效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Mybatis generator自動生成代碼插件實例解析

    Mybatis generator自動生成代碼插件實例解析

    這篇文章主要介紹了Mybatis generator自動生成代碼插件實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java靜態(tài)方法里使用spring的注入對象方式

    java靜態(tài)方法里使用spring的注入對象方式

    本文分析了在使用Spring框架時,靜態(tài)方法中引用非靜態(tài)變量導(dǎo)致空指針的問題,并提出了使用`@PostConstruct`注解、`@Value`注解、構(gòu)造注入和`InitializingBean`接口等解決方案
    2026-04-04
  • java Spring MVC4環(huán)境搭建實例詳解(步驟)

    java Spring MVC4環(huán)境搭建實例詳解(步驟)

    spring WEB MVC框架提供了一個MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開來,使它們之間的耦合性更低
    2017-08-08
  • Java集成presto查詢方式

    Java集成presto查詢方式

    這篇文章主要介紹了Java集成presto查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringBoot基于數(shù)據(jù)庫實現(xiàn)定時任務(wù)過程解析

    SpringBoot基于數(shù)據(jù)庫實現(xiàn)定時任務(wù)過程解析

    這篇文章主要介紹了SpringBoot基于數(shù)據(jù)庫實現(xiàn)定時任務(wù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • java實現(xiàn)RTF文件查看器(附帶源碼)

    java實現(xiàn)RTF文件查看器(附帶源碼)

    這篇文章主要介紹了一個基于?Java?Swing?的?RTF?文件查看器,既可作為輕量級桌面應(yīng)用,也可嵌入到更大規(guī)模的管理系統(tǒng)中,滿足用戶對?RTF?文檔的即時預(yù)覽、樣式保真和簡單導(dǎo)航需求
    2025-06-06
  • Java?ConcurrentHashMap實現(xiàn)線程安全的代碼示例

    Java?ConcurrentHashMap實現(xiàn)線程安全的代碼示例

    眾所周知ConcurrentHashMap是HashMap的多線程版本,HashMap?在并發(fā)操作時會有各種問題,而這些問題,只要使用ConcurrentHashMap就可以完美解決了,本文將給詳細(xì)介紹ConcurrentHashMap是如何保證線程安全的
    2023-05-05
  • java compiler沒有1.8怎么解決

    java compiler沒有1.8怎么解決

    這篇文章主要介紹了java compiler沒有1.8的解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08

最新評論

米易县| 克什克腾旗| 诸暨市| 镇原县| 左云县| 安远县| 思茅市| 布尔津县| 乌拉特前旗| 淳化县| 扎兰屯市| 临海市| 新化县| 黑水县| 平南县| 绥宁县| 肇庆市| 工布江达县| 安国市| 仁布县| 子长县| 凤凰县| 五原县| 志丹县| 浠水县| 福建省| 星子县| 马公市| 武安市| 龙州县| 霍林郭勒市| 岚皋县| 清流县| 广平县| 资源县| 电白县| 壶关县| 新邵县| 疏勒县| 金湖县| 瓮安县|