首页 > 解决方案 > 为什么 BsonDocument.Parse 反序列化错误的十进制128

问题描述

我有一个带有查询字符串的链接:

https://.../monsters/find?query={"battery_life": 2.4}

控制器中的这个方法:

    [HttpGet("find")]
    public async Task<IActionResult> GetAllByCriteria([FromQuery(Name = "query")]string query)
    {
        if (!string.IsNullOrEmpty(query))
        {
            BsonDocument q = BsonDocument.Parse(query);


            var result = await _monsterService.GetAll(q);

            return Ok(result);
        }

        return NotFound();
    }

并且模型电池寿命字段是:

    [BsonRepresentation(BsonType.Decimal128)]
    public decimal BatteryLife { get; set; }

我要求电池寿命等于 2.4,但是当我使用 Postman 进行调试时,在 BsonDocument.Parse 之后我得到:

在此处输入图像描述

为什么会发生这种情况以及解决方案是什么。

谢谢

更新

我从调试器中看到的是 battery_life 类型是字符串。值 (2.4) 类型是 ? =>

在此处输入图像描述

标签: c#mongodb

解决方案


好的,@ckuri 说得对,默认情况下它被反序列化为双精度。所以发生的事情是当我创建一个电池寿命类型为十进制128 的新对象时,它是否保存为十进制128。可以在此处使用 MongoDB 指南针查看:

在此处输入图像描述

当我试图查询它时,它正在寻找具有 double 类型的字段 battery_life,它不存在,因此它返回一个空数组。

当我手动将类型更改为 double 并重试查询时,它可以工作。所以从现在开始,我将我的对象字段电池寿命类型更改为

    [BsonRepresentation(BsonType.Double)]
    public double BatteryLife { get; set; }

多亏了你们,我才学到了更多!


推荐阅读