我正在使用小数位将数据存储在mongoDB上,因为我需要尽可能地提高精度。
要在mongoDB上使用$ sqrt,您需要传递double作为参数,因此我需要将十进制数转换为double,然后将其传递给$ sqrt。
使用mongoDB shell确实很容易,但是当您尝试使用带有IQueryable接口的mongoDB c#驱动程序编写此代码时,事情就变得复杂了。
我的代码:
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强制转换?