欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java查詢(xún)MongoDB數(shù)據(jù)庫(kù)案例大全

 更新時(shí)間:2023年07月05日 09:14:55   作者:記錄學(xué)習(xí)的習(xí)習(xí)君  
這篇文章主要給大家介紹了關(guān)于Java查詢(xún)MongoDB數(shù)據(jù)庫(kù)的一些相關(guān)案例,Java可以使用MongoDB的官方Java驅(qū)動(dòng)程序來(lái)連接和操作MongoDB數(shù)據(jù)庫(kù),需要的朋友可以參考下

寫(xiě)在前面:

實(shí)習(xí)期間做公司的任務(wù),用的是MongoDB。剛接觸感覺(jué)很多東西都不會(huì),現(xiàn)在任務(wù)做完了?;剡^(guò)頭來(lái)記錄和鞏固一下知識(shí),也方面以后回來(lái)查閱。本篇博客只記錄Mongodb的查詢(xún)方法,方便查找!MongoDB 4.0以上版本!! 廢話不多說(shuō),直接開(kāi)始記錄:

1. 查詢(xún)所有文檔

// 獲取集合
MongoCollection<User> collection = mongoDatabase.getCollection("users", User.class);
// 查詢(xún)所有文檔
List<User> userList = new ArrayList<>();
MongoCursor<User> cursor = collection.find().iterator();
while (cursor.hasNext()) {
    User user = cursor.next();
    userList.add(user);
}
 

在這個(gè)示例中,我們首先獲取了名為users的集合,并將其映射到User類(lèi)。接著,我們使用find()方法查詢(xún)集合中的所有文檔,并使用iterator()方法獲取游標(biāo)對(duì)象。通過(guò)遍歷游標(biāo)對(duì)象中的結(jié)果,我們可以將每個(gè)文檔轉(zhuǎn)換為User對(duì)象,并將其添加到一個(gè)List中。最終,我們可以在userList中找到所有查詢(xún)結(jié)果。

2. 指定查詢(xún)條件

指定查詢(xún)條件可以使用find()方法的參數(shù)。該參數(shù)是一個(gè)Bson對(duì)象,用于指定查詢(xún)條件。Bson是MongoDB提供的一個(gè)接口,用于構(gòu)建查詢(xún)條件。

// 獲取集合
MongoCollection<User> collection = mongoDatabase.getCollection("users", User.class);
// 構(gòu)建查詢(xún)條件
Bson filter = Filters.eq("name", "John");
// 查詢(xún)文檔
List<User> userList = new ArrayList<>();
MongoCursor<User> cursor = collection.find(filter).iterator();
while (cursor.hasNext()) {
    User user = cursor.next();
    userList.add(user);
}

構(gòu)建查詢(xún)條件有很多種,以下分類(lèi):

等于:Filters.eq("name", "John"),用于查詢(xún)name屬性等于"John"的文檔。

不等于:Filters.ne("name", "John"),用于查詢(xún)name屬性不等于"John"的文檔。

大于:Filters.gt("age", 18),用于查詢(xún)age屬性大于18的文檔。

大于等于:Filters.gte("age", 18),用于查詢(xún)age屬性大于等于18的文檔。

小于:Filters.lt("age", 30),用于查詢(xún)age屬性小于30的文檔。

小于等于:Filters.lte("age", 30),用于查詢(xún)age屬性小于等于30的文檔。

包含:Filters.in("name", Arrays.asList("John", "Mike")),用于查詢(xún)name屬性包含在"John""Mike"中的文檔。 

不包含:Filters.nin("name", Arrays.asList("John", "Mike")),用于查詢(xún)name屬性不包含在"John""Mike"中的文檔。

正則表達(dá)式:Filters.regex("name", "^J.*n$"),用于查詢(xún)name屬性匹配正則表達(dá)式"^J.*n$"的文檔。

與:Filters.and(Filters.eq("name", "John"), Filters.gt("age", 18)),用于查詢(xún)name屬性等于"John"age屬性大于18的文檔。

或:Filters.or(Filters.eq("name", "John"), Filters.gt("age", 18)),用于查詢(xún)name屬性等于"John"age屬性大于18的文檔。

存在:Filters.exists("name", true),用于查詢(xún)存在name屬性的文檔。

不存在:Filters.exists("name", false),用于查詢(xún)不存在name屬性的文檔。

使用and()or()方法來(lái)組合多個(gè)條件,例如:

類(lèi)似于sql:`name = "john" and (age > 18 or age < 30)`

Bson filter = Filters.and(
    Filters.eq("name", "John"),
    Filters.or(
        Filters.gt("age", 18),
        Filters.lt("age", 30)
    )
);

3. 指定查詢(xún)返回的字段

在 MongoDB 中,可以使用 projection 對(duì)查詢(xún)返回的字段進(jìn)行指定。通過(guò)指定 projection,可以過(guò)濾掉不需要的字段,提高查詢(xún)效率,并減小數(shù)據(jù)傳輸?shù)拇笮 ?/p>

在 Java 中,可以使用 Projections 類(lèi)來(lái)進(jìn)行字段的指定。該類(lèi)提供了一些靜態(tài)方法,可以方便地創(chuàng)建不同類(lèi)型的投影表達(dá)式。以下是一些常用的示例:

返回指定字段

List<Document> results = collection.find().projection(Projections.include("name", "age")).into(new ArrayList<>());

上述代碼中的 Projections.include("name", "age") 指定了只返回 nameage 兩個(gè)字段。

排除指定字段

List<Document> results = collection.find().projection(Projections.exclude("address")).into(new ArrayList<>());

上述代碼中的 Projections.exclude("address") 指定了不返回 address 字段。

限制返回字段

List<Document> results = collection.find().projection(Projections.slice("comments", 5)).into(new ArrayList<>());

上述代碼中的 Projections.slice("comments", 5) 指定了只返回 comments 字段中的前五個(gè)元素。

進(jìn)行計(jì)算并返回結(jié)果

List<Document> results = collection.find().projection(Projections.fields(Projections.include("name"), Projections.computed("agePlus10", "$age + 10"))).into(new ArrayList<>());

上述代碼中的 Projections.computed("agePlus10", "$age + 10") 指定了將 age 字段加上 10 并將結(jié)果保存到名為 agePlus10 的新字段中。

其他的限制操作

1. Projections.elemMatch(String field, Bson filter)

該方法用于返回某個(gè)數(shù)組字段中符合特定條件的子文檔。參數(shù) field 指定了要查詢(xún)的數(shù)組字段,filter 指定了查詢(xún)條件。以下是一個(gè)示例:

List<Document> results = collection.find().projection(Projections.elemMatch("comments", Filters.eq("author", "John Doe"))).into(new ArrayList<>());

上述代碼中,Projections.elemMatch("comments", Filters.eq("author", "John Doe")) 表示查詢(xún) comments 數(shù)組字段中 authorJohn Doe 的子文檔,并返回符合條件的子文檔。

2. Projections.metaTextScore(String metaTextScoreField)

該方法用于返回使用 $meta 操作符計(jì)算出來(lái)的文本搜索相關(guān)度得分。參數(shù) metaTextScoreField 指定了保存文本搜索相關(guān)度得分的字段名稱(chēng)。以下是一個(gè)示例:

List<Document> results = collection.find(Filters.text("Java")).projection(Projections.metaTextScore("score")).sort(Sorts.metaTextScore("score")).into(new ArrayList<>());

上述代碼中,Projections.metaTextScore("score") 表示使用 $meta 操作符計(jì)算出來(lái)的文本搜索相關(guān)度得分保存到 score 字段中。

3. Projections.excludeId()

該方法用于排除 _id 字段。以下是一個(gè)示例:

List<Document> results = collection.find().projection(Projections.excludeId()).into(new ArrayList<>());

4. Projections.excludeFields(Bson... fields)

該方法用于排除指定的字段。參數(shù) fields 指定了要排除的字段列表。以下是一個(gè)示例:

List<Document> results = collection.find().projection(Projections.excludeFields("password", "email")).into(new ArrayList<>());

上述代碼中,Projections.excludeFields("password", "email") 表示排除 passwordemail 兩個(gè)字段。

4. 限制返回文檔的數(shù)量

在 MongoDB 中,可以通過(guò) limit() 方法來(lái)限制查詢(xún)結(jié)果返回的文檔數(shù)量。

limit() 方法接受一個(gè)整數(shù)參數(shù),表示返回的文檔數(shù)量。例如,以下代碼限制查詢(xún)結(jié)果只返回前 10 條文檔:

FindIterable<Document> iterable = collection.find();
iterable.limit(10);

如果查詢(xún)結(jié)果包含的文檔數(shù)量小于指定的限制數(shù),則返回實(shí)際包含的文檔數(shù)。例如,如果查詢(xún)結(jié)果只包含 5 個(gè)文檔,但是限制返回文檔數(shù)量為 10,則只會(huì)返回這 5 個(gè)文檔。

跳過(guò)指定數(shù)量的文檔

skip() 方法接受一個(gè)整數(shù)參數(shù),表示要跳過(guò)的文檔數(shù)量。例如,以下代碼跳過(guò)查詢(xún)結(jié)果中的前 5 個(gè)文檔:

FindIterable<Document> iterable = collection.find();
iterable.skip(5);

如果查詢(xún)結(jié)果包含的文檔數(shù)量小于指定的跳過(guò)數(shù),則返回一個(gè)空的文檔集合。例如,如果查詢(xún)結(jié)果只包含 3 個(gè)文檔,但是要求跳過(guò)前 5 個(gè)文檔,則返回一個(gè)空的文檔集合。

分頁(yè)查詢(xún)

FindIterable<Document> iterable = collection.find().sort(Sorts.descending("age"));
iterable.skip(5).limit(10);

上述代碼會(huì)先按照年齡逆序排序,然后跳過(guò)前 5 個(gè)文檔,最后限制返回結(jié)果最多只有 10 個(gè)文檔。

5. 排序

sort() 方法接受一個(gè) Bson 對(duì)象作為參數(shù),表示排序的規(guī)則。通常,可以使用 Sorts 類(lèi)提供的靜態(tài)方法來(lái)創(chuàng)建 Bson 對(duì)象,例如:

collection.find().sort(Sorts.ascending("age"));

上述代碼會(huì)按照年齡升序排序查詢(xún)結(jié)果。

collection.find().sort(Sorts.descending("age"));

上述代碼會(huì)按照年齡降序排序查詢(xún)結(jié)果。

在 MongoDB 中,可以按照多個(gè)屬性進(jìn)行排序。例如,以下代碼會(huì)先按照年齡升序排序,然后按照名稱(chēng)降序排序:

collection.find().sort(Sorts.ascending("age").descending("name"));

除了使用 Sorts 類(lèi)提供的靜態(tài)方法外,還可以使用 OrderBy 類(lèi)的方法來(lái)創(chuàng)建排序規(guī)則。例如,以下代碼與前面的代碼等效:

collection.find().sort(OrderBy.asc("age").desc("name"));

sort() 方法也可以和其他查詢(xún)條件一起使用。例如,以下代碼會(huì)查詢(xún)年齡大于 18 歲的文檔,并且按照年齡降序排序:

collection.find(Filters.gt("age", 18)).sort(Sorts.descending("age"));

6. 匹配嵌套文檔

在 MongoDB 中,文檔可以包含嵌套的文檔,也就是一個(gè)文檔中的某個(gè)字段的值是一個(gè)文檔。查詢(xún)這種嵌套文檔需要使用嵌套查詢(xún)操作符,例如 $elemMatch

        假設(shè)有一個(gè) users 集合,每個(gè)文檔包含一個(gè) name 字段和一個(gè) favorites 字段,favorites 字段是一個(gè)數(shù)組,包含多個(gè)喜歡的電影名和電影類(lèi)型:

{ "_id" : ObjectId("617f120110136e6f7c6e301d"), "name" : "Alice", "favorites" : [ { "title" : "Inception", "genre" : "Sci-Fi" }, { "title" : "The Shawshank Redemption", "genre" : "Drama" } ] }
{ "_id" : ObjectId("617f120110136e6f7c6e301e"), "name" : "Bob", "favorites" : [ { "title" : "The Godfather", "genre" : "Crime" }, { "title" : "The Dark Knight", "genre" : "Action" } ] }

要查詢(xún) Alice 喜歡的所有科幻電影,可以使用 $elemMatch 操作符:

collection.find(Filters.and(Filters.eq("name", "Alice"), Filters.elemMatch("favorites", Filters.eq("genre", "Sci-Fi"))));

上述代碼會(huì)查詢(xún) name 為 "Alice" 并且 favorites 數(shù)組中至少有一項(xiàng)的 genre 字段是 "Sci-Fi" 的文檔。

可以將 $elemMatch 操作符用在多層嵌套的文檔中。例如,假設(shè)有一個(gè) products 集合,每個(gè)文檔包含一個(gè) name 字段和一個(gè) reviews 字段,reviews 字段是一個(gè)數(shù)組,包含多個(gè)評(píng)價(jià)文檔,每個(gè)評(píng)價(jià)文檔又包含一個(gè) comments 字段和一個(gè) score 字段:

{ "_id" : ObjectId("6181a77a2b59f5df0e13d7c4"), "name" : "iPhone", "reviews" : [ { "comments" : "Good", "score" : 8 }, { "comments" : "Bad", "score" : 2 } ] }
{ "_id" : ObjectId("6181a77a2b59f5df0e13d7c5"), "name" : "iPad", "reviews" : [ { "comments" : "Very good", "score" : 9 }, { "comments" : "Not bad", "score" : 6 } ] }

要查詢(xún)?cè)u(píng)分大于 7 分的 iPad 評(píng)價(jià)文檔的所有評(píng)論,可以使用多層嵌套的 $elemMatch 操作符:

collection.find(Filters.and(Filters.eq("name", "iPad"), Filters.elemMatch("reviews", Filters.elemMatch("comments", Filters.gt("score", 7)))));

7. 使用聚合管道

MongoDB聚合管道是指將多個(gè)數(shù)據(jù)處理操作組合在一起以形成數(shù)據(jù)處理管道,以便更有效地查詢(xún)和處理數(shù)據(jù)。聚合管道可以用于實(shí)現(xiàn)許多常見(jiàn)的數(shù)據(jù)處理操作,例如過(guò)濾、排序、分組、計(jì)數(shù)、平均值、求和、求最大/最小值等。

在Java中,我們可以使用MongoDB的聚合管道API來(lái)執(zhí)行聚合查詢(xún)。以下是一個(gè)使用聚合管道查詢(xún)的示例代碼:

MongoCollection<Document> collection = database.getCollection("users");
 
List<Document> pipeline = Arrays.asList(
    new Document("$match", new Document("age", new Document("$gt", 30))),
    new Document("$group", new Document("_id", "$gender").append("count", new Document("$sum", 1))),
    new Document("$sort", new Document("count", -1)),
    new Document("$limit", 10)
);
 
MongoCursor<Document> cursor = collection.aggregate(pipeline).iterator();
while (cursor.hasNext()) {
    Document doc = cursor.next();
    System.out.println(doc.toJson());
}

在這個(gè)示例中,我們首先獲取了名為“users”的集合,然后使用一個(gè)管道列表定義了我們的聚合查詢(xún)。該管道由四個(gè)操作組成:

  • $match:過(guò)濾年齡大于30歲的文檔。
  • $group:按性別分組,并計(jì)算每個(gè)組中文檔的數(shù)量。
  • $sort:按文檔數(shù)量進(jìn)行排序,以便按數(shù)量最多的順序返回結(jié)果。
  • $limit:限制結(jié)果數(shù)量為10。

最后,我們使用aggregate方法執(zhí)行查詢(xún),并使用迭代器遍歷查詢(xún)結(jié)果并打印輸出。

8. 分組查詢(xún)

分組查詢(xún)是 MongoDB 中非常有用的一種聚合操作,它可以將文檔集合按照某個(gè)字段進(jìn)行分組,然后對(duì)每組進(jìn)行統(tǒng)計(jì)分析,例如計(jì)算每個(gè)分組內(nèi)文檔數(shù)量的總和、平均值、最大值、最小值等等。下面介紹如何在 Java 代碼中使用 MongoDB 進(jìn)行分組查詢(xún)。

首先,我們需要使用 Aggregation 類(lèi)中的 group() 方法進(jìn)行分組操作。該方法接受一個(gè) Bson 類(lèi)型的參數(shù),表示分組條件。例如,下面的代碼將按照 name 字段進(jìn)行分組:

Bson group = Aggregates.group("$name");

接下來(lái),我們可以使用 Aggregation 類(lèi)中的各種聚合方法對(duì)每個(gè)分組進(jìn)行統(tǒng)計(jì)分析。例如,下面的代碼將在每個(gè)分組中計(jì)算 age 字段的平均值:

Bson avgAge = Aggregates.avg("age", "$age");

最后,我們可以使用 Aggregation 類(lèi)中的 pipeline() 方法將所有的聚合操作串聯(lián)起來(lái),從而得到最終的結(jié)果。例如,下面的代碼將按照 name 字段進(jìn)行分組,并在每個(gè)分組中計(jì)算 age 字段的平均值:

List<Bson> pipeline = Arrays.asList(
    Aggregates.group("$name", Aggregates.avg("age", "$age"))
);
MongoCollection<Document> collection = database.getCollection("users");
MongoCursor<Document> cursor = collection.aggregate(pipeline).iterator();
while (cursor.hasNext()) {
    Document result = cursor.next();
    System.out.println(result.toJson());
}

在上面的代碼中,我們使用 pipeline() 方法將分組操作和計(jì)算平均值操作串聯(lián)起來(lái),然后使用 aggregate() 方法執(zhí)行聚合操作,并將結(jié)果輸出到控制臺(tái)上。

除了平均值之外,Aggregation 類(lèi)中還提供了各種聚合方法,例如 sum()、count()、max()、min() 等等,可以根據(jù)實(shí)際需求進(jìn)行選擇。

總結(jié)

到此這篇關(guān)于Java查詢(xún)MongoDB數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)Java查詢(xún)MongoDB案例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Spring Boot+MyBatis框架做查詢(xún)操作的示例代碼

    使用Spring Boot+MyBatis框架做查詢(xún)操作的示例代碼

    這篇文章主要介紹了使用Spring Boot+MyBatis框架做查詢(xún)操作的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 一篇文章搞定數(shù)據(jù)庫(kù)連接池

    一篇文章搞定數(shù)據(jù)庫(kù)連接池

    數(shù)據(jù)庫(kù)連接池在編寫(xiě)應(yīng)用服務(wù)是經(jīng)常需要用到的模塊,太過(guò)頻繁的連接數(shù)據(jù)庫(kù)對(duì)服務(wù)性能來(lái)講是一個(gè)瓶頸,使用緩沖池技術(shù)可以來(lái)消除這個(gè)瓶頸,本文就來(lái)介紹Java常見(jiàn)的幾種,感興趣的可以了解一下
    2021-07-07
  • Java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • java解決雪花ID在前端精度丟失問(wèn)題

    java解決雪花ID在前端精度丟失問(wèn)題

    雪花算法生成的64位Long類(lèi)型ID在傳遞到前端時(shí)可能會(huì)因JavaScript的精度限制導(dǎo)致精度丟失,這篇文章主要介紹了java解決雪花ID在前端精度丟失問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2024-11-11
  • Hadoop集成Spring的使用詳細(xì)教程(快速入門(mén)大數(shù)據(jù))

    Hadoop集成Spring的使用詳細(xì)教程(快速入門(mén)大數(shù)據(jù))

    這篇文章主要介紹了Hadoop集成Spring的使用詳細(xì)教程(快速入門(mén)大數(shù)據(jù)),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • JSON中fastjson、jackson、gson如何選擇

    JSON中fastjson、jackson、gson如何選擇

    在Java中,JSON的解析方式很多,例如fastjson(阿里)、Gson(谷歌)、jackjson等,本文主要介紹了JSON中fastjson、jackson、gson如何選擇,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • java8 List<Object>去掉重復(fù)對(duì)象的幾種方法

    java8 List<Object>去掉重復(fù)對(duì)象的幾種方法

    本文主要介紹了java8 List<Object>去掉重復(fù)對(duì)象的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot利用隨機(jī)鹽值實(shí)現(xiàn)密碼的加密與驗(yàn)證

    SpringBoot利用隨機(jī)鹽值實(shí)現(xiàn)密碼的加密與驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何利用隨機(jī)鹽值實(shí)現(xiàn)密碼的加密與驗(yàn)證,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2024-02-02
  • Java 11 正式發(fā)布,這 8 個(gè)逆天新特性教你寫(xiě)出更牛的代碼

    Java 11 正式發(fā)布,這 8 個(gè)逆天新特性教你寫(xiě)出更牛的代碼

    美國(guó)當(dāng)?shù)貢r(shí)間9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發(fā)布,可在生產(chǎn)環(huán)境中使用!這是自 Java 8 后的首個(gè)長(zhǎng)期支持版本
    2018-09-09
  • java讀取大文件簡(jiǎn)單實(shí)例

    java讀取大文件簡(jiǎn)單實(shí)例

    這篇文章主要介紹了java讀取大文件簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-12-12

最新評(píng)論