Текущий код работает для одного фильтра совпадений, который применяется к все поля, но мне нужно добавить отдельные фильтры для каждого yField. Вот соответствующая часть моего кода:
Код: Выделить всё
[Authorize]
[HttpPost("GetChartDataAsync")]
public async Task GetChartData(chartclass chart)
{
var collection = GetMyDb().MDB.GetCollection("d_sales_date");
var groupStage = new BsonDocument
{
{ "_id", $"${chart.xfield}" }
};
foreach (var y in chart.yfield)
{
Aggregations aggregate = Aggregations.Sum;
var aggregationOperator = aggregate switch
{
Aggregations.Sum => "$sum",
Aggregations.Min => "$min",
Aggregations.Max => "$max",
Aggregations.Average => "$avg",
_ => "$sum"
};
//y field filters
groupStage.Add(y.name, new BsonDocument(aggregationOperator, $"${y.name}"));
}
var pipeline = new List
{
new BsonDocument("$group", groupStage)
};
var results = await collection.Aggregate(pipeline).ToListAsync();
return results.ToJson();
}
public class chartclass
{
public string xfield { get; set; } = "";
public List yfield { get; set; } = new();
}
public class YField
{
public string name { get; set; } = "";
public BsonDocument filter { get; set; } = new();
public Aggregations aggregate { get; set; } = Aggregations.Sum;
}
Например:
Для yField1 примените фильтр совпадения, где полеA > 100.
/>Для yField2, примените фильтр соответствия, где полеB == "значение".
Желаемое поведение:
Я хочу изменить конвейер, включив в него условные этапы $match для каждого поля yField перед добавлением его логики агрегирования на этап $group.
Любые рекомендации и предложения будут рассмотрены. очень признателен.
Подробнее здесь: https://stackoverflow.com/questions/792 ... pipeline-i