Я использую десятичные числа для хранения моих данных на mongoDB, потому что мне нужно иметь как можно большую точность.Чтобы использовать $ sqrt на mongoDB, вам нужно передать в качестве аргумента значение double, поэтому мне нужно привести свое десятичное число к двойному, а затем передать его в $ sqrt.Использование оболочки mongoDB - это простая работа, но когда вы пытаетесь закодировать это с помощью драйвера mongoDB c # с интерфейсом IQueryable, все становится сложнее.
Мой код:
var data = _myRepository.AsQueryable()
.GetValues(equipmentId, startDate, endDate)
.GroupBy(g => g.timestamp)
.Select(p => new MyDTO {
timestamp = p.Key,
sqrt_calc = (decimal)Math.Sqrt(
(double)p.Sum(x => x.my_decimal_value)
)
.OrderBy(q => q.timestamp);
Я получаю следующееисключение: OverflowException: арифметическая операция привела к переполнению.
IQueryable создает следующий запрос:
aggregate([{
"$match": {
"timestamp": {
"$gte": ISODate("2018-12-18T12:23:48Z"),
"$lte": ISODate("2018-12-19T12:23:48Z")
},
"equipment_id": NumberLong(168)
}
}, {
"$group": {
"_id": "$timestamp",
"__agg0" : { "$sum" : "$my_decimal_value" }
}
}, {
"$project": {
"timestamp": "$_id",
"sqrt_calc": { "$sqrt" : ["$__agg0"] }
"_id": 0
}
}, {
"$sort": {
"timestamp": 1
}
}
])
Как видите, после $ sqrt отсутствует $ toDouble, поэтому $ sqrtполучает десятичную дробь и производит NaN, который, я считаю, вызывает исключение.Есть ли способ сказать IQueryable добавить приведение в $ toDouble?