gpt4 book ai didi

c# - mongodb linq 提供程序 : incorrect behavior for fields of type decimal?

转载 作者:可可西里 更新时间:2023-11-01 09:24:05 27 4
gpt4 key购买 nike

使用 mongodb 版本 3.4.3,c# 驱动程序 (nuget MongoDb.Driver) 版本 2.4.3

给定一个类,该类的字段Amount 类型为decimal,以及该类型的mongodb 集合。在集合中查询金额大于或小于特定值的条目会给出不正确的结果。将类型更改为“int”时,代码会正常运行。在 MongoDb 中使用小数字段是否有问题?

下面的示例代码说明了这个问题。

class C
{
public int Id { get; set; }
public string Description { get; set; }
public decimal Amount { get; set; }
}

// assumes a locally installed mongodb
var connectionstring = "mongodb://localhost:27017/test";
var mongo = new MongoClient(connectionstring);
var db = mongo.GetDatabase("test");

db.DropCollection("testcollection");
db.CreateCollection("testcollection");
var collection = db.GetCollection<C>("testcollection");

// populate with 2 instances (amount 1 and amount 10)

collection.InsertMany(new[]
{
new C{Id = 1, Description = "small", Amount = 1},
new C{Id = 2, Description = "large", Amount = 10},
});

// verify that the documents are indeed persisted as expected
var all = collection.AsQueryable().ToList();
Debug.Assert(all.Count == 2);
Debug.Assert(all[1].Amount == 10);

// the assert below inexplicably fails (the query returns no results)
var largerThan5 = collection.AsQueryable().Where(c => c.Amount > 5).ToList();
Debug.Assert(largerThan5.Count == 1);

最佳答案

那是因为它会将所有小数转换为字符串(因此它们将存储在 mongo 数据库的字符串列中)。当然,在这种情况下,您的 gt 比较会失败。有个很老的issue here关于那个,它被关闭为“按预期工作”。据我所知——那时没有十进制 BSON 类型,所以这种行为是合理的。

现在here可以看到3.4版本中新增了十进制BSON类型,实际上C#驱动已经支持了。但是,如果您只使用 .NET decimal 类型 - 即使使用 mongo 3.4,它仍会将其转换为字符串。

您需要做的(因为您运行的是 3.4)是:

  1. [BsonRepresentation(BsonType.Decimal128)] 装饰你的 Amount:

    class C
    {
    public int Id { get; set; }
    public string Description { get; set; }
    [BsonRepresentation(BsonType.Decimal128)]
    public decimal Amount { get; set; }
    }
  2. 将功能兼容性版本设置为 3.4,因为 BSON 十进制无法由以前的版本处理,如 here 所述:

    db.adminCommand({setFeatureCompatibilityVersion: "3.4"})

之后,您的小数点将被正确映射,查询将按预期工作。

关于c# - mongodb linq 提供程序 : incorrect behavior for fields of type decimal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com