使用C#处理BSON文档的MongoDB方法

32

我花费了许多时间寻找答案......在PHP中这很容易,但是我无法在C#(我是C#和MongoDB的新手)中做到这一点。我正在尝试遍历存储文档的所有级别。该文档如下:

{
    "_id": ObjectId("51f90101853bd88971ecdf27"),
    "fields": [
        {
            "ID": ObjectId("51fd09498b080ee40c00514e"),
            "NAME": "ID",
            "TYPE": "Text"
        },
        {
            "ID": ObjectId("51fd09a68b080ee40c0064db"),
            "NAME": "Title",
            "TYPE": "Text"
        },
        {
            "ID": ObjectId("51fd09b28b080ee40c004d31"),
            "NAME": "Start Date",
            "TYPE": "Date"
        },
        {
            "ID": ObjectId("51fd09c28b080ee40c007f2e"),
            "NAME": "Long Description",
            "TYPE": "Memo"
        }
    ],
    "name": "TODB",
    "updated": "Wed Jul 31 2013 08:20:17 GMT-0400 (Eastern Daylight Time)"
}

我可以轻松获取“name”和“updated”的值,但无法弄清如何访问“fields”数组。

迄今为止的代码:

{
    MongoServer mongo = MongoServer.Create();
    mongo.Connect();
    var db = mongo.GetDatabase("forms"); 
    mongo.RequestStart(db);
    var collection = db.GetCollection("forms");
    var query = new QueryDocument("name",
    "TODB"); 
    mongo.Disconnect();
}

@foreach(BsonDocument item in collection.Find(query))
{
    @item.GetElement("name").Value
    @item.GetElement("_id").Value
}

我能够访问名称和 _id,只是无法访问任何子文档的值。

非常感谢您提前的帮助! 在弄清楚阅读之后,我还要写入数据....

1个回答

58

有几种方法,但这里是其中之一:

 // build some test data
 BsonArray dataFields = new BsonArray { new BsonDocument { 
     { "ID" , ObjectId.GenerateNewId()}, { "NAME", "ID"}, {"TYPE", "Text"} } };
 BsonDocument nested = new BsonDocument {
     { "name", "John Doe" },
     { "fields", dataFields },
     { "address", new BsonDocument {
             { "street", "123 Main St." },
             { "city", "Madison" },
             { "state", "WI" },
             { "zip", 53711}
         }
     }
 };
 // grab the address from the document,
 // subdocs as a BsonDocument
 var address = nested["address"].AsBsonDocument;
 Console.WriteLine(address["city"].AsString); 
 // or, jump straight to the value ...
 Console.WriteLine(nested["address"]["city"].AsString);
 // loop through the fields array
 var allFields = nested["fields"].AsBsonArray ;
 foreach (var fields in allFields)
 {
     // grab a few of the fields:
     Console.WriteLine("Name: {0}, Type: {1}", 
         fields["NAME"].AsString, fields["TYPE"].AsString);
 }

您可以经常使用字符串索引器["name-of-property"]来遍历字段和子文档字段。然后,使用AsXYZ属性将字段值转换为特定类型,如上所示。


1
你知道是否有更简单的方法吗?比如Key.Key.Key这样的方式?因为如果你已经保存了面包屑,那么使用["key"]["key"]["key"].AsString就非常糟糕。 - Fraga
3
在这个上下文中,我不确定你所说的“面包屑”是什么意思。该对象具有按名称检索字段的索引器。除非您创建一个强类型类,否则您不会得到您可能正在寻找的体验。 - WiredPrairie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接