将MongoDB设置为将类序列化为BsonDocument

时间:2014-10-26 13:48:36

标签: c# mongodb serialization bson

我有一个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 );

现在可以了。

1 个答案:

答案 0 :(得分:0)

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

编辑1 除了之外,我会尝试删除SensorData的所有属性。如果这样做,我会比添加所有其他(逐个)。