首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将MongoDB设置为将类序列化为BsonDocument

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

Stack Overflow用户
提问于 2014-10-26 13:48:35
回答 1查看 12.5K关注 0票数 1

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

当我用基本类型填充字典时-序列化过程运行良好,但是当我试图插入填充了一些自定义类(例如- Person类)的字典时,我将得到下一个错误:.NET type 'Person' cannot be mapped to a BsonValue

我注意到,如果插入转换为BsonDocument的自定义类型,序列化过程将非常有效。

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

更新:提供真实代码

代码语言:javascript
运行
复制
    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的方法:

代码语言:javascript
运行
复制
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的代码:

代码语言:javascript
运行
复制
            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: OK发现了问题,在我的“保存到db”方法中,我使用了下一段代码来转换我的字典BsonDocument

代码语言:javascript
运行
复制
        var bsonObj = new BsonDocument(RawSensorMessageDictionary);

我希望从其他对象创建一个新的'BsonDocument‘实例将完全像object.ToBsonDocument()那样处理转换,但显然并非如此。

最后,我将上面的代码替换为以下代码:

代码语言:javascript
运行
复制
    var bsonObj = RawSensorMessageDictionary.ToBsonDocument();
    dal.SaveRawSensorData(dic );

现在起作用了。

EN

回答 1

Stack Overflow用户

发布于 2014-10-26 14:41:05

如果字典中的字符串是mongodb文档中的属性,则非原始类型是mongodb中的子文档。请尝试用[BsonElement]标记类中的所有属性,用[BsonId]标记Bson。一定要遵守这里的所有规则:如果你能提供更多的信息,使用C#驱动程序序列化文档会很好。

编辑1我将尝试删除除之外的SensorData的所有属性。如果这有效的话,我会把所有其他的(一个一个地)加起来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26573668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档