📅  最后修改于: 2022-03-11 14:49:10.940000             🧑  作者: Mango
public class Person
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
public class Peger
{
public int Count { get; set; }
public int Page { get; set; }
public int Size { get; set; }
public IEnumerable Items { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var client = new MongoClient();
var database = client.GetDatabase("pager_test");
var collection = database.GetCollection(nameof(Person));
int page = 1;
int pageSize = 5;
var results = await GetPagerResultAsync(page, pageSize, collection);
}
private static async Task GetPagerResultAsync(int page, int pageSize, IMongoCollection collection)
{
// count facet, aggregation stage of count
var countFacet = AggregateFacet.Create("countFacet",
PipelineDefinition.Create(new[]
{
PipelineStageDefinitionBuilder.Count()
}));
// data facet, we’ll use this to sort the data and do the skip and limiting of the results for the paging.
var dataFacet = AggregateFacet.Create("dataFacet",
PipelineDefinition.Create(new[]
{
PipelineStageDefinitionBuilder.Sort(Builders.Sort.Ascending(x => x.Surname)),
PipelineStageDefinitionBuilder.Skip((page - 1) * pageSize),
PipelineStageDefinitionBuilder.Limit(pageSize),
}));
var filter = Builders.Filter.Empty;
var aggregation = await collection.Aggregate()
.Match(filter)
.Facet(countFacet, dataFacet)
.ToListAsync();
var count = aggregation.First()
.Facets.First(x => x.Name == "countFacet")
.Output()
?.FirstOrDefault()
?.Count ?? 0;
var data = aggregation.First()
.Facets.First(x => x.Name == "dataFacet")
.Output();
return new Pager
{
Count = (int)count / pageSize,
Size = pageSize,
Page = page,
Items = data
};
}
}