如何使用嵌套的expandoObject创建BSON文档,其中一个是转换后的Dictionary

时间:2016-01-26 14:25:43

标签: c# json mongodb bson

我有一个expandoObject d,我想迭代一个字典,并使用它的键和值来创建一个新对象,{key:value,key:value},然后将该新对象分配给d,当然最后将其序列化为bsonDocument以便插入。

如果只是拿字典并执行.toArray(),我就不会得到mongoDB序列化错误,但是如果我从那个新对象中创建一个新的expandObject,或者只是简单地传递我提到的字典作为d.newObject我得到一个无用的mondodb序列化错误。

我将如何解决这个问题(1),以及我对BSON文档期望什么能够和不能序列化的内容有什么遗漏?

1 个答案:

答案 0 :(得分:0)

而不是从头开始使用ExpandoObject为MongoDB编写这种动态类型功能,您可以从使用动态ORM或ODM(例如Slazure)中获益,MongoDB支持仍然处于封闭测试状态但是应尽快公开发布。下面是一个示例,其中Slazure Linq查询从“TestCustomers”集合返回一些文档,并将每个文档属性名称写入控制台:

using SysSurge.Slazure.MongoDB.Linq;
using SysSurge.Slazure.Core;
using SysSurge.Slazure.Core.Linq.QueryParser;

public void EnumProperties()
{
    // Get a reference to the collection
    dynamic storage = new QueryableStorage<DynDocument>("mongodb://user:pass@example.org/MongoDBExample");
    QueryableCollection<DynDocument> collection = storage.TestCustomers;

    // Build collection query
    var queryResult = collection.Where("SignedUpForNewsletter = true and Age < 22");

    foreach (DynDocument document in queryResult)
    {
        foreach (KeyValuePair<string, IDynProperty> keyValuePair in document)
        {
            Console.WriteLine(keyValuePair.Key);
        }
    }
}

如果你需要实际获得BsonDocument对象,那么你可以通过调用DynDocument方法从Slazure Document对象中获取它,例如:

foreach (DynDocument document in queryResult)
{
    BsonDocument bsonDoc = document.Document    
    Console.WriteLine(bsonDoc["someProperty"].AsString());