Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDb.Driver 2.4反序列化数据类型更改_C#_Mongodb_Mongodb .net Driver_Mongodb.driver - Fatal编程技术网

C# MongoDb.Driver 2.4反序列化数据类型更改

C# MongoDb.Driver 2.4反序列化数据类型更改,c#,mongodb,mongodb-.net-driver,mongodb.driver,C#,Mongodb,Mongodb .net Driver,Mongodb.driver,我有以下POCO课程: class MyClass { public Objectid _id {get;set;} public string property1 {get;set;} public string property2 {get;set;} public int property3 {get;set;} } 该对象存储在MongoDb集合中。数据在生成的bson中具有正确的数据类型: property1: "SomeString" propert

我有以下POCO课程:

class MyClass {
    public Objectid _id {get;set;}
    public string property1 {get;set;}
    public string property2 {get;set;}
    public int property3 {get;set;}
}
该对象存储在MongoDb集合中。数据在生成的bson中具有正确的数据类型:

property1: "SomeString"
property2: "12345"
property3: 98765
当我尝试查询集合时:

var items = db.GetCollection<MyClass>("MyClass").AsQueryable().Select(x => x.property1 == "SomeString").ToList();
我收到一个错误,指示无法反序列化property2: 无法从BsonType“Int64”反序列化“字符串”

我正在尝试将数据库中bson文档中的字符串值反序列化为对象上的字符串值

为什么BsonSerializer试图将其转换为十进制?在本例中,该值恰好是数字,但该字段在类中定义为字符串,因为该值通常是字母数字


我正在使用VS2013中的MongoDb.Driver v2.4包。

要更改Mongo属性类型,您需要为该属性编写自己的序列化程序

这是原始对象,您已将其中几个对象保存到Mongo

public class TestingObject
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public int TestingObjectType { get; set; }
}
现在我们需要将TestObjectType从int更改为string

这是我们的新班级

public class TestingObject
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string TestingObjectType { get; set; }
}
然后您将获得

无法从BsonType“Int64”反序列化“字符串”

您需要的是一个序列化程序来为您处理转换

public class TestingObjectTypeSerializer : IBsonSerializer
{
    public Type ValueType { get; } = typeof(string);

    public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        if (context.Reader.CurrentBsonType == BsonType.Int32) return GetNumberValue(context);

        return context.Reader.ReadString();
    }

    public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
    {
        context.Writer.WriteString(value as string);
    }

    private static object GetNumberValue(BsonDeserializationContext context)
    {
        var value = context.Reader.ReadInt32();

        switch (value)
        {
            case 1:
                return "one";
            case 2:
                return "two";
            case 3:
                return "three";
            default:
                return "BadType";
        }
    }
}
关键部分是反序列化方法。仅当类型为int32时,才希望运行转换逻辑。如果类型是一个anyother,我们将假定它已经是一个字符串并返回该值

Serialize只是WriteString,任何更新或保存的文档都将以字符串形式包含新值

现在,您只需更新对象,告诉属性使用序列化程序

public class TestingObject
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    [BsonSerializer(typeof(TestingObjectTypeSerializer))]
    public string TestingObjectType { get; set; }
}

下次从Mongo读取时,不应出现错误。

字段“property2”中的集合“MyClass”包含int64类型的值。您可以在Mongo控制台中直接使用javascript更新数据类型。我认为c驱动程序不支持相同的特性。