mongodb 分組分頁

2021-10-11 20:52:51 字數 1917 閱讀 2948

最近遇到個需求,要做mongo的分頁。略複雜。要先根據欄位a分組,再根據欄位b(時間字段)排序,並取出時間排序中的最小時間,作為整個分組每條記錄的時間。最後再對分組進行分頁。效果如圖:

想了很久,頭禿,也碰到了很多坑。

先記錄一波語句:

//設定對映

projectionoperation projectionoperation = aggregation.project().

and(

"$records.code").

as("code").

and(

"$records.name").

as("name").

and(

"$records.ts").

as("ts").

and(

"$records.change_id").

as("change_id").

and(

"$records.create_time").

as("create_time").

and(

"$records.last").

as("last").

and(

"$records.trade_price").

as("trade_price").

and(

"$records.bs_flag").

as("bs_flag").

and(

"$records.position_before").

as("position_before").

and(

"$records.position_after").

as("position_after"

).andexclude(

"_id");

//篩選

aggregation aggregation = aggregation.newaggregation(

aggregation.

match

(criteria)

, aggregation.

group

("$change_id"

).push(

"$$root").

as("records").

max(

"$create_time").

as("start_time"),

aggregation.sort(new sort(new sort.

order

(sort.direction.

desc

,"start_time"))

),aggregation.skip(currentpage>

1 ? (currentpage-1)

*pagesize:0),

aggregation.

limit

(pagesize)

, aggregation.unwind(

"$records"),

projectionoperation

); aggregationresults aggregate = mongotemplate.aggregate(aggregation, mongotemplate.getcollectionname(rrobochangerecord.class)

, rrobochangerecord.class);)

;

踩過的坑:unwind不要在分頁之前使用,不然排序就不是按分頁分組了。

project裡的字段起別名要按照實體對應的mongo欄位命名,不然會對映不上。

陣列分組問題

這個問題是這個樣子滴 有乙個無序 元素個數為n n為偶數 的正整數陣列arr,要求 如何能把這個陣列分割為元素個數為n 2的兩個子陣列,並使兩個子陣列的的和最接近。我的思路是 1 把陣列拆成2個子陣列a和b 2 用a中的每個元素與b中的每個元素比較,陣列值之和的絕對值小於原來的值就交換 其實並不難,...

PHP陣列分頁,PHP陣列分頁操作

php陣列分頁實現方法,php陣列操作 arr test array array number 1 datalist 111datalist array number 2 datalist 222datalist array number 3 datalist 333datalist array n...

Dubbo之服務分組 分組聚合。

當乙個介面有多種實現時,可以用group區分。任意組 2.2.0以上版本支援,總是只調乙個可用組的實現 按組合並返回結果,比如選單服務,介面一樣,但有多種實現,用group區分,現在消費方需從每種group中呼叫一次返回結果,合併結果返回,這樣就可以實現聚合選單項。從2.1.0版本開始支援 配置如 ...