2013-08-05 15 views
13

Spędziłem wiele godzin szukając odpowiedzi ... Jest to bardzo łatwe w PHP, ale po prostu nie mogę go umieścić w C# (jestem nowy w C# i mongo ...) Próbuję iterować przez wszystkie poziomy przechowywanego dokumentu. Dokument wygląda następująco:mongodb C# jak pracować z dokumentem BSON

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

mam żadnego problemu z dostępem do „nazwa” i „zaktualizowany”, ale nie może dowiedzieć się, jak uzyskać dostęp do „pola” tablicę.

kod do tej pory:

{ 
    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 
} 

Znowu jestem w stanie uzyskać dostęp do nazwy i _id prostu nie każdy z wartości dokumentów podrzędnych.

Z góry dziękujemy za wszelką pomoc! Po uzyskać odczyt zorientowali się, ja też będzie chciał zapisywać dane ....

Odpowiedz

28

Istnieje kilka sposobów, ale tutaj jest jeden:

// 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); 
} 

Często można użyć indekser ciąg ["name-of-property"] przechodzenie przez pola i pola dokumentu dodatkowego. Następnie, używając właściwości AsXYZ, należy rzutować wartość pola na określony typ, jak pokazano powyżej.

+0

Czy wiesz, że istnieje coś prostego? Podobnie jak Key.Key.Key? bo naprawdę źle działa ["klucz"] ["klucz"] ["klucz"]. AsString, jeśli masz zapisaną bułkę breadcrumb – Fraga

+1

Nie jestem pewien, co masz na myśli przez bułkę tartą w tym kontekście. Obiekt ma indeksator do pobierania pól według nazwy. Jeśli nie utworzysz klasy ściśle napisanej, nie uzyskasz doświadczenia, którego prawdopodobnie szukasz. – WiredPrairie