mongotemplate 查list_mongoTemplate.aggregate()聚合查询 时间
一、概述
1.?聚合的表達(dá)式
MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果。有點(diǎn)類(lèi)似sql語(yǔ)句中的 count(*)。
下表展示了一些聚合的表達(dá)式:
表達(dá)式描述實(shí)例
$sum
計(jì)算總和。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg
計(jì)算平均值
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min
獲取集合中所有文檔對(duì)應(yīng)值得最小值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max
獲取集合中所有文檔對(duì)應(yīng)值得最大值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push
在結(jié)果文檔中插入值到一個(gè)數(shù)組中。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet
在結(jié)果文檔中插入值到一個(gè)數(shù)組中,但不創(chuàng)建副本。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first
根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)。
db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last
根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù)
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
2. 管道的概念
管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的參數(shù)。
MongoDB的聚合管道將MongoDB文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理。管道操作是可以重復(fù)的。
表達(dá)式:處理輸入文檔并輸出。表達(dá)式是無(wú)狀態(tài)的,只能用于計(jì)算當(dāng)前聚合管道的文檔,不能處理其它的文檔。
這里我們介紹一下聚合框架中常用的幾個(gè)操作:
$project:修改輸入文檔的結(jié)構(gòu)。可以用來(lái)重命名、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔。
$match:用于過(guò)濾數(shù)據(jù),只輸出符合條件的文檔。$match使用MongoDB的標(biāo)準(zhǔn)查詢(xún)操作。
$limit:用來(lái)限制MongoDB聚合管道返回的文檔數(shù)。
$skip:在聚合管道中跳過(guò)指定數(shù)量的文檔,并返回余下的文檔。
$unwind:將文檔中的某一個(gè)數(shù)組類(lèi)型字段拆分成多條,每條包含數(shù)組中的一個(gè)值。
$group:將集合中的文檔分組,可用于統(tǒng)計(jì)結(jié)果。
$sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
3. 聚合查詢(xún)示例:
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
但是在代碼中要如何實(shí)現(xiàn)類(lèi)似以上功能呢?
二、代碼實(shí)現(xiàn)(sum求和)
功能描述:
當(dāng)name和course同時(shí)傳參時(shí),按id分組,統(tǒng)計(jì)總分?jǐn)?shù)
按name分組,統(tǒng)計(jì)相同name的總分?jǐn)?shù)
按course分組,統(tǒng)計(jì)總分?jǐn)?shù)
public double getTotleScoreWithMongoTemplate(StudentScore studentScore) {
//封裝查詢(xún)條件
List operations = new ArrayList<>();
if (StringUtils.isEmpty(studentScore.getName()) && StringUtils.isEmpty(studentScore.getCourse())){
//totleScore為StudentScore類(lèi)中新建的屬性,用于接收統(tǒng)計(jì)后的總分?jǐn)?shù);當(dāng)然也可以使用score(或其他屬性)接收
operations.add(Aggregation.group("id").sum("score").as("totleScore"));
}
if (!StringUtils.isEmpty(studentScore.getName())) {
operations.add(Aggregation.match(Criteria.where("name").is(studentScore.getName())));
operations.add(Aggregation.group("name").sum("score").as("totleScore"));
}
if (!StringUtils.isEmpty(studentScore.getCourse())) {
operations.add(Aggregation.match(Criteria.where("course").is(studentScore.getCourse())));
operations.add(Aggregation.group("course").sum("score").as("totleScore"));
}
Aggregation aggregation = Aggregation.newAggregation(operations);
//查詢(xún)、并獲取結(jié)果
AggregationResults results = mongoTemplate.aggregate(aggregation, "studentScore", StudentScore.class);
double totleScore = results.getUniqueMappedResult().getTotleScore();
return totleScore;
}
對(duì)于其他的功能,可以修改以上代碼自行測(cè)試,此處不再舉例
總結(jié)
以上是生活随笔為你收集整理的mongotemplate 查list_mongoTemplate.aggregate()聚合查询 时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 麒麟810怎么样_华为麒麟810这个跑分
- 下一篇: instant.now时区不正确_Cen