2013-04-11 56 views
10

我处于无法预测MongoDB文档将具有哪些字段的情况。所以我不能再创建一个_id字段类型为BsonID的对象。 我发现创建一个Dictionary(HashTable)并在里面添加我的DateTime和String对象非常方便,尽可能多的时候我需要它。使用c#驱动程序将字典插入到MongoDB中

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

这里是我喜欢的类型哈希表的对象(比如字典,但具有不同类型的内线):

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

而且从司机我得到的错误是:

串行DictionarySerializer预期序列化选项类型DictionarySerializationOptions,而不是DocumentSerializationOptions

我使用了Google搜索,但找不到任何东西有用。我究竟做错了什么?

回答

13

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

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

} 

请注意,我们必须使用字典<字符串,对象>而不是哈希表。

然后,您可以使用如下代码插入文档:

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") 
} 
> 
+0

这是辉煌, 非常感谢你! – 2013-05-09 22:20:35

+0

@RobertStam这为“动态”字段提供了解决方案。两个问题:** 1)**在面包店应用程序中,用户更愿意遵守自己的'品牌A,糖,2(暗示勺子),300(暗示温度),20(暗含分钟)'的惯例。每个人都没有钥匙。 ** 2)**当我做更多的阅读时,[mapping class](http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/)也指出我必须使用' IDictionary',很好。但它表示它不会维持秩序。任何方式来维护秩序? – Jeb50 2017-02-25 20:01:27

相关问题