web-dev-qa-db-ja.com

mongodb c#BSONドキュメントの使用方法

私は答えを探すのに何時間も費やしました...これはPHPで非常に簡単ですが、C#とmongoが初めてです。 。)保存されたドキュメントのすべてのレベルを反復処理しようとしていますが、ドキュメントは次のようになります。

{
  "_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)"
}

「名前」と「更新」にアクセスするのに問題はありませんが、「フィールド」配列にアクセスする方法がわかりません。

これまでのコード:

{
   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にアクセスできます。

何か助けてくれてありがとう!読み取り値を把握した後、データを書き込みたいと思います。

19
user2167261

いくつかの方法がありますが、ここに1つあります:

 // 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プロパティを使用して、上記のようにフィールド値を特定の型にキャストします。

37
WiredPrairie