【问题标题】:Insert Dictionary into MongoDB with c# driver使用 c# 驱动程序将字典插入 MongoDB
【发布时间】:2013-04-03 23:57:09
【问题描述】:

我无法预测我的 MongoDB 文档将包含哪些字段。所以我不能再创建一个带有_id 类型为BsonID 的字段的对象。 我发现创建一个 Dictionary (HashTable) 并在其中添加我的 DateTime 和 String 对象非常方便,我需要多少次都可以。

然后我尝试将生成的 Dictionary 对象插入 MongoDb,但默认序列化失败。

这是我的 HashTable 类型对象(类似于字典,但里面有不同的类型):

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

我得到的驱动程序的错误是:

Serializer DictionarySerializer 期望 DictionarySerializationOptions 类型的序列化选项,而不是 DocumentSerializationOptions

我用谷歌搜索了它,但找不到任何有用的东西。我做错了什么?

【问题讨论】:

    标签: c# mongodb serialization dictionary insert


    【解决方案1】:

    驱动程序需要能够找到 _id 字段。您可以创建一个只有两个属性的 C# 类:Id 和 Values。

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

    请注意,我们必须使用 Dictionary 而不是 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 shell 来确认插入的文档是否具有所需的形式:

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

    【讨论】:

    • @RobertStam 这为“动态”字段提供了解决方案。两个问题:1) 在面包店应用程序中,用户更喜欢保持自己的写作习惯brand A, sugar, 2 (implies spoon), 300 (implies temperature), 20 (implies minutes)。每个人都没有钥匙。 2) 当我阅读更多内容时,mapping class 也指出我必须使用IDictionary,很好。但它表示不会保留订单。有什么办法可以维持秩序?
    猜你喜欢
    • 2016-09-20
    • 2017-05-09
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多