MongoDB C# Driver GroupBy 获取同一 属性 的最新对象。 (有聚合)
MongoDB C# Driver GroupBy to get latest object of the same property. (With aggregation)
我有以下模型的集合“评估”:
[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,然后 return 这些评估.
结果是 'Evaluation' 个对象的列表,(每个 AlertId 一个评估)
我如何使用 MongoDB 带聚合的驱动程序构造该查询?
感谢您的帮助!
通过一些研究提出了这个解决方案:
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;
我有以下模型的集合“评估”:
[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,然后 return 这些评估.
结果是 'Evaluation' 个对象的列表,(每个 AlertId 一个评估)
我如何使用 MongoDB 带聚合的驱动程序构造该查询?
感谢您的帮助!
通过一些研究提出了这个解决方案:
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;