【问题标题】:Set MongoDB to Serialize a class as BsonDocument将 MongoDB 设置为将类序列化为 BsonDocument
【发布时间】:2014-12-21 19:28:35
【问题描述】:

我有一个Dictionary<string, object> 作为MongoDB.Save() 的插入输入。

当我用原始类型填充此字典时 - 序列化过程工作正常,但当我尝试插入填充了一些自定义类(例如 - Person 类)的字典时,我收到下一个错误: .NET type 'Person' cannot be mapped to a BsonValue

我注意到,如果我插入转换为 BsonDocument 的自定义类型,序列化过程会很好。

如何定义 MongoDB 以将特定类序列化为 BsonDocument


更新:提供真实代码

    here is my SensorData class: 

    [DataContract]
    public class SensorData
    {

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string Type { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string Desc { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public SensorStatus Status { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string Value { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string ValueUnits { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.Boolean)]
        public bool Event { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.Int32)]
        public int TTL { get; set; }
    }

以下是将数据保存到 MongoDB 的方法:

public void Save(Dictionary<string, object> RawSensorMessageDictionary)
        {          
            try
            {
                var policyColl = new MongoClient(ConnString).GetServer().GetDatabase(DB_NAME).GetCollection<BsonDocument>(CollectionNames.RawSensorMessage.ToString());


                if (!RawSensorMessageDictionary.Any(p => p.Key == "_id")) //if rawSensorMessageID is empty, mongodb will set it
                    RawSensorMessageDictionary.Add("_id", ObjectId.GenerateNewId().ToString());
                var bsonObj = new BsonDocument(RawSensorMessageDictionary);
                policyColl.Save(bsonObj);

            }
            catch (Exception ex)
            {
                   //log exception
            }
        }

这是来自我的 UnitTest 的代码:

            DataAccess.MongoDAL dal = new DataAccess.MongoDAL();
            Dictionary<string, object> dic = new Dictionary<string, object>();
            dic.Add("1", true);
            dic.Add(Message.RESOURCE_TYPE, "aaa");
            dic.Add(Message.RESOURCE_NAME, "bbb");
            dic.Add(Message.SENSOR_DATA, new SensorData { Desc = "aaa", Event = true, Status = SensorStatus.Active, TTL = 4, Type = "sss", Value = "222" });
            dal.SaveRawSensorData(dic );

我希望我的应用程序自动将SensorData 对象序列化为BsonDocument。如果我不手动执行此操作,则会出现以下异常:.NET type 'SensorData' cannot be mapped to a BsonValue

我该怎么做?


更新 2: 好的,找到了问题,在我的“保存到数据库”方法中,我使用了下一个代码来转换我的字典BsonDocument

        var bsonObj = new BsonDocument(RawSensorMessageDictionary);

我希望从其他对象创建一个新的“BsonDocument”实例将像object.ToBsonDocument() 一样处理转换,但显然不是。

最后我把上面的代码换成了下面的:

    var bsonObj = RawSensorMessageDictionary.ToBsonDocument();
    dal.SaveRawSensorData(dic );

现在可以了。

【问题讨论】:

    标签: c# mongodb serialization bson


    【解决方案1】:

    如果字典中的字符串是 mongodb 文档中的属性,那么非原始类型就是 mongodb 中的子文档。请尝试用[BsonElement] 标记类中的所有属性,用[BsonId] 标记Bson Id。并确保您遵守此处的所有规则:Serialize Documents with the C# Driver 如果您提供更多信息,那就太好了

    编辑 1 除了Value,我会尝试删除SensorData 的所有属性。如果这可行,我会添加所有其他(一个接一个)。

    【讨论】:

    • 还有一个问题,字典的一个实例应该是一个文档,还是字典中的每个条目都是一个文档?
    • 字典的一个实例应该由一个文档表示
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多