我的数据库中有一个集合,我在其中记录事件。每种类型的事件都有不同的数据集。我用以下类定义了这个:

[CollectionName("LogEvent")]
public class LogEvent
{
    public LogEvent(string eventType)
    {
        EventType = eventType;
        EventData = new Dictionary<string, object>();
    }

    public string EventType { get; private set; }
    [BsonExtraElements]
    public IDictionary<string, object> EventData { get; private set; }
}

现在-这在某种程度上相当有效。只要EventData字典的元素是简单类型…
var event = new LogEvent("JobQueues"){
    EventData = new Dictionary<string, object>(){
        { "JobId": "job-123" },
        { "QueueName": "FastLane" }
    }
}

_mongoCollection.InsertOne(event);

…我得到的Mongo文件像
{
  _id: ObjectId(...),
  EventType: "JobQueued",
  JobId: "job-123",
  QueueName: "FastLane"
}

但一旦我试图在字典中添加自定义类型,事情就停止了。
var event = new LogEvent("JobQueues"){
    EventData = new Dictionary<string, object>(){
        { "JobId": "job-123" },
        { "QueueName": "FastLane" },
        { "JobParams" : new[]{"param-1", "param-2"}},
        { "User" : new User(){ Name = "username", Age = 10} }
    }
}

这会给我一些错误,比如".NET type ... cannot be mapped to BsonType."
如果我删除[BsonExtraElements]标记,并且[BsonDictionaryOptions(DictionaryRepresentation.Document)]它将开始序列化内容而不会出错,但是它会给我一个完全不同的文档,我不喜欢。
{
  _id: ObjectId(...),
  EventType: "JobQueued",
  EventData: {
      JobId: "job-123",
      QueueName: "FastLane",
      User: {
       _t: "User",
       Name: "username",
       Age: 10
      },
      JobParams : {
       _t: "System.String[]",
       _v: ["param-1", "param-2"]
      }
   }
}

我想要的是以下结果:
{
  _id: ObjectId(...),
  EventType: "JobQueued",
  JobId: "job-123",
  QueueName: "FastLane",
  User: {
    Name: "username",
    Age: 10
  },
  JobParams : ["param-1", "param-2"]
}

有人知道如何做到这一点吗?
(我正在使用C Mongodriver v2.3)

最佳答案

Mongodriver是这样工作的,因为它需要类型的信息才能将其还原。
您可以做的是为用户类编写并注册自己的custommapper:

public class CustomUserMapper : ICustomBsonTypeMapper
{
    public bool TryMapToBsonValue(object value, out BsonValue bsonValue)
    {
        bsonValue = ((User)value).ToBsonDocument();
        return true;
    }
}

启动程序的某个地方:
BsonTypeMapper.RegisterCustomTypeMapper(typeof(User), new CustomUserMapper());

这样就行了,我已经成功地按您的要求序列化了您的数据。
但是:当您想要反序列化它时,您将得到User类作为Dictionary,因为驱动程序将没有关于hiow的信息来反序列化它:
c# - C#MongoDb Dictionary的字符串&lt;string,object&gt;-LMLPHP

关于c# - C#MongoDb Dictionary的字符串<string,object>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41875032/

10-17 02:04