How to calculate and return sum in Mongodb csharp driver using bsonDocument?

Viewed 24

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?

0 Answers
Related