Skip to content

Commit 5fc138a

Browse files
committed
Add Facet Paging
1 parent eed79c1 commit 5fc138a

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

src/JustCSharp.Database.MongoDB/Extensions/AggregateFluentExtensions.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq.Expressions;
55
using JustCSharp.Data.Linq;
66
using JustCSharp.Data.Requests;
7+
using JustCSharp.Database.MongoDB.Model;
78
using MongoDB.Driver;
89

910
namespace JustCSharp.Database.MongoDB.Extensions;
@@ -82,4 +83,26 @@ public static IAggregateFluent<T> PagingBy<T>(this IAggregateFluent<T> query, in
8283

8384
return query.Skip(skip).Limit(pageSize);
8485
}
86+
87+
public static IAggregateFluent<MongoFacetPagingResult<T>> FacetPagingBy<T>(
88+
this IAggregateFluent<T> query, int page, int pageSize)
89+
{
90+
var skip = (page - 1) * pageSize;
91+
var countPipeline = PipelineStageDefinitionBuilder.Count<T>();
92+
var skipPipeline = PipelineStageDefinitionBuilder.Skip<T>(skip);
93+
var limitPipeline = PipelineStageDefinitionBuilder.Limit<T>(pageSize);
94+
95+
var countFacet = new AggregateFacet<T, AggregateCountResult>(
96+
nameof(MongoFacetPagingResult<T>.CountResult),
97+
PipelineDefinition<T, AggregateCountResult>.Create(
98+
new List<IPipelineStageDefinition>{countPipeline}));
99+
100+
var pagingFacet = new AggregateFacet<T, T>(
101+
nameof(MongoFacetPagingResult<T>.Data),
102+
PipelineDefinition<T, T>.Create(
103+
new List<IPipelineStageDefinition>{skipPipeline, limitPipeline}));
104+
105+
return query
106+
.Facet<T, MongoFacetPagingResult<T>>(countFacet, pagingFacet);
107+
}
85108
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using MongoDB.Bson.Serialization.Attributes;
4+
5+
namespace JustCSharp.Database.MongoDB.Model;
6+
7+
public class MongoFacetPagingResult<TData>
8+
{
9+
public long Count => CountResult.FirstOrDefault()?.Count ?? 0;
10+
public MongoFacetCountResult[] CountResult { get; set; }
11+
public List<TData> Data { get; set; }
12+
}
13+
14+
public class MongoFacetCountResult
15+
{
16+
[BsonElement("count")]
17+
public long Count { get; set; }
18+
}

src/JustCSharp.Database.MongoDB/Trace.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
namespace JustCSharp.Database.MongoDB;
55

6-
internal class Trace
6+
public class Trace
77
{
8-
private static readonly string TraceName = typeof(Trace).Namespace ?? "JustCSharp.Database.MongoDB";
8+
public static readonly string TraceName = typeof(Trace).Namespace ?? "JustCSharp.Database.MongoDB";
99

1010
internal static ActivitySource ActivitySource { get; } =
1111
new(TraceName, AssemblyHelper.GetAssemblyVersion(typeof(Trace)));

0 commit comments

Comments
 (0)