最近遇到個需求,要做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版本開始支援 配置如 ...