I’ve been trying for quite some time to get this code to work. But it just doesn’t, I don’t understand why:
public async Task<PaginatedData<DbUser>> GetPaginatedAsync(
int pageSize,
int page,
UserTypes userType,
string fullName
)
{
var countFacet = AggregateFacet.Create(
"count",
PipelineDefinition<DbUser, AggregateCountResult>.Create(
new[] { PipelineStageDefinitionBuilder.Count<DbUser>() }
)
);
var dataFacet = AggregateFacet.Create(
"data",
PipelineDefinition<DbUser, DbUser>.Create(
new[]
{
PipelineStageDefinitionBuilder.Sort(Builders<DbUser>.Sort.Ascending(x => x.Id)),
PipelineStageDefinitionBuilder.Skip<DbUser>((page - 1) * pageSize),
PipelineStageDefinitionBuilder.Limit<DbUser>(pageSize),
PipelineStageDefinitionBuilder.Project<DbUser, DbUser>(
Builders<DbUser>.Projection.Exclude("password")
),
}
)
);
var filter =
userType == UserTypes.All
? Builders<DbUser>.Filter.Empty
: Builders<DbUser>.Filter.Eq(x => x.UserType, (int)userType);
filter &= Builders<DbUser>.Filter.Eq(x => x.IsDeleted, false);
if (!string.IsNullOrWhiteSpace(fullName))
{
var regexPattern = new BsonRegularExpression($"^{fullName}", "i");
filter &= Builders<DbUser>.Filter.Regex("full_name", regexPattern);
}
var aggregation = await databaseContext
.Users.Aggregate()
.Match(filter)
.Facet(countFacet, dataFacet)
.ToListAsync();
var count =
aggregation
.First()
.Facets.First(x => x.Name == "count")
.Output<AggregateCountResult>()
?.FirstOrDefault()
?.Count ?? 0;
var totalPages = Math.Ceiling(count / (double)pageSize);
var data = aggregation.First().Facets.First(x => x.Name == "data").Output<DbUser>();
var employeeData = data.Select(x => x);
return new PaginatedData<DbUser>
{
CurrentPage = page,
PageSize = pageSize,
TotalPages = (int)totalPages,
TotalRecords = count,
Data = employeeData
};
}
The amount of records is always returning as 0.
I have tried applying a Match stage at the dataFacet, and that also doesn’t work.
This is another method that does the same regex filtering:
public async Task<IEnumerable<DbUser>> SearchAheadUserAsync(UserTypes userType, string fullName)
{
var regexPattern = new BsonRegularExpression($"^{fullName}", "i");
var filter = Builders<DbUser>.Filter.Regex("full_name", regexPattern);
filter &=
userType == UserTypes.All
? Builders<DbUser>.Filter.Empty
: Builders<DbUser>.Filter.Eq(x => x.UserType, (int)userType);
var results = await databaseContext.Users.Find(filter).ToListAsync();
return results;
}
And it works correctly, so the issue lies at the usage of facets.
New contributor
diegowrhasta is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.