Вставить словарь в MongoDB с помощью драйвера С#

Я в ситуации, когда я не могу предсказать, какие поля будет иметь мой документ MongoDB. Поэтому я больше не могу создать объект с полем _id типа BsonID. Мне очень удобно создавать словарь (HashTable) и добавлять объекты DateTime и String внутри, столько раз, сколько мне нужно.

Затем я пытаюсь вставить результирующий объект Dictionary в MongoDb, но сериализация по умолчанию не выполняется.

Здесь мой объект типа HashTable (например, словарь, но с различными типами внутри):

{ "_id":"",
"metadata1":"asaad",
"metadata2":[],
"metadata3":ISODate("somedatehere")}

И ошибка драйвера, которую я получаю:

Сериализатор DictionarySerializer предлагает варианты сериализации типа DictionarySerializationOptions, а не DocumentSerializationOptions

Я искал его, но не нашел ничего полезного. Что я делаю неправильно?

Ответ 1

Драйвер должен найти поле _id. Вы можете создать класс С#, который имеет только два свойства: Id и значения.

public class HashTableDocument
{
    public ObjectId Id { get; set; }
    [BsonExtraElements]
    public Dictionary<string, object> Values { get; set; }

}

Обратите внимание, что мы должны использовать Dictionary < string, object > вместо Hashtable.

Чтобы вставить документ, вы можете использовать следующий код:

var document = new HashTableDocument
{
    Id = ObjectId.GenerateNewId(),
    Values = new Dictionary<string, object>
    {
        { "metadata1", "asaad" },
        { "metadata2", new object[0] },
        { "metadata3", DateTime.UtcNow }
    }
};
collection.Insert(document);

Мы можем использовать оболочку MongoDB для подтверждения того, что вставленный документ имеет желаемую форму:

> db.test.find().pretty()
{
        "_id" : ObjectId("518abdd4e447ad1f78f74fb1"),
        "metadata1" : "asaad",
        "metadata2" : [ ],
        "metadata3" : ISODate("2013-05-08T21:04:20.895Z")
}
>