【问题标题】:MongoDB C# Driver GroupBy to get latest object of the same property. (With aggregation)MongoDB C# Driver GroupBy 获取相同属性的最新对象。 (带聚合)
【发布时间】:2021-03-13 21:38:00
【问题描述】:

我有以下模型的集合“评估”:

[BsonCollection("evaluations")]
public class Evaluation : Document
{
    [BsonRepresentation(BsonType.ObjectId)]
    public string AlertId { get; set; }

    public string EvaluationStatus { get; set; }

    public DateTime EvaluatedAt { get; set; }
}

我想做的是检索一个包含每个 Alert 对象的最后一次评估的列表,这意味着按 AlertId 对评估进行分组,然后获取该组的最新 EvaluatedAt,然后返回这些评估。
结果是“评估”对象的列表,(每个 AlertId 一个评估)

如何使用带有聚合的 MongoDB 驱动程序构造该查询?

感谢您的帮助!

【问题讨论】:

    标签: c# .net mongodb-query aggregation mongodb-.net-driver


    【解决方案1】:

    经过一番研究,想出了这个解决方案:

            var alertIds = alertss.Select(x => x.Id.ToString()).ToList();
    
            var sortByLatest = Builders<Evaluation>.Sort.Descending(x => x.EvaluatedAt);
    
            var groupByAlertId = new BsonDocument
                      {
                          { "_id", "$AlertId" },
                          { "EvaluationId", new BsonDocument { { "$first", "$_id" } } },
                          { "EvaluationStatus", new BsonDocument { { "$first", "$EvaluationStatus" } } },
                          { "EvaluatedAt", new BsonDocument { { "$first", "$EvaluatedAt" } } },
                      };
    
            ProjectionDefinition<BsonDocument> projection = new BsonDocument
                {
                    {"_id", "$EvaluationId"},
                    {"AlertId", "$_id"},
                    {"EvaluationStatus", "$EvaluationStatus"},
                    {"EvaluatedAt", "$EvaluatedAt"},
                };
    
            var evaluations = evaluationsRepository.GetCollection().Aggregate()
                .Match(x => alertIds.Contains(x.AlertId))
                .Sort(sortByLatest)
                .Group(groupByAlertId)
                .Project(projection)
                .As<Evaluation>().ToList();
    
            return evaluations;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多