I have an model like that
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public DateTime CreatedDate { get; set; } = DateTime.UtcNow;
public DateTime UpdatedDate { get; set; }
[BsonElement("payload")]
public BsonDocument Payload { get; set; } = default!;
Data I store in Database like that:
{
"_id" : ObjectId("6328145eb153ade25617875c"),
"CreatedDate" : ISODate("2022-09-19T07:03:58.868+0000"),
"UpdatedDate" : ISODate("0001-01-01T00:00:00.000+0000"),
"payload" : {
"time" : "2022-07-20T08:00:12.080+08:00",
"id" : "1",
"source" : {
"id" : "1"
},
"type" : "mmm_pv",
"pv" : {
"current" : {
"unit" : "A",
"value" : NumberInt(46)
},
"voltage" : {
"unit" : "V",
"value" : 26.590068000000002
}
}
}
}
My solution here but very slow.
var filterById = Builders<Tempture>.Filter.Empty;
var filterByType = Builders<Tempture>.Filter.Eq("payload.type", "mmm_pv");
filterById = Builders<Tempture>.Filter.Eq("payload.source.id", id);
var filter = Builders<Tempture>.Filter.And(filterByType, filterById);
var data = await _repo.FindAsync(filter);
var result = (_mapper.Map<List<Dto>>(data)).Select(x => x.Tempture);
var unit = "kWH";
var sum = 0.0;
foreach (var item in result)
{
try
{
var current = item.mmm_pv.current.value;
var voltage = item.mmm_pv.voltage.value;
sum += (double)current * (double)voltage;
}
catch (Exception ex)
{
_logger.Warn(ex.Message);
}
}
Question is: How can I calculate: sum (current.value * voltage.value) in DB and return result by using Agregate or simething for better perfomance?