2013-04-11 17 views
10

Jestem w sytuacji, w której nie mogę przewidzieć, które pola będą mieć mój dokument MongoDB. Nie mogę już tworzyć obiektu o polu _id typu BsonID. Uważam za bardzo wygodne tworzenie Słownika (HashTable) i dodawanie do niego obiektów DateTime i String, tyle razy, ile ich potrzebuję.Wstaw słownik do MongoDB za pomocą sterownika C#

Następnie próbuję wstawić wynikowy obiekt Dictionary do MongoDb, ale domyślna serializacja kończy się niepowodzeniem.

Oto mój obiekt typu HashTable (jak słownik, ale z różnych typów wewnątrz):

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

a błąd w sterowniku pojawia się:

serializer DictionarySerializer opcje spodziewać serializacji typu DictionarySerializationOptions, a nie DocumentSerializationOptions

Przeszukałem go, ale nie mogłem znaleźć niczego przydatne. Co ja robię źle?

Odpowiedz

13

Sterownik musi znaleźć pole _id. Można utworzyć klasę C#, która ma tylko dwie właściwości: Id i Wartości.

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

} 

Należy pamiętać, że mamy do wykorzystania słownik < ciąg, obiekt > zamiast Hashtable.

Następnie można użyć kodu jak poniżej, aby włożyć dokument:

var document = new HashTableDocument 
{ 
    Id = ObjectId.GenerateNewId(), 
    Values = new Dictionary<string, object> 
    { 
     { "metadata1", "asaad" }, 
     { "metadata2", new object[0] }, 
     { "metadata3", DateTime.UtcNow } 
    } 
}; 
collection.Insert(document); 

możemy zastosować powłokę MongoDB, aby potwierdzić, że włożony dokument ma pożądaną postać:

> db.test.find().pretty() 
{ 
     "_id" : ObjectId("518abdd4e447ad1f78f74fb1"), 
     "metadata1" : "asaad", 
     "metadata2" : [ ], 
     "metadata3" : ISODate("2013-05-08T21:04:20.895Z") 
} 
> 
+0

To jest genialne , Dziękuję Ci bardzo! –

+0

@RobertStam Zapewnia to rozwiązanie dla pól "dynamicznych". Dwa questioins: ** 1) ** w aplikacji piekarniczej, użytkownicy wolą zachować własną konwencję pisania "marka A, cukier, 2 (implikuje łyżkę), 300 (sugeruje temperaturę), 20 (implikuje minuty)". Każdy nie ma klucza. ** 2) ** Jak robię więcej czytania, [klasa mapowania] (http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/) również wskazuje, że muszę użyć '. IDictionary', Fine. Ale twierdzi, że nie zachowa porządku. Jakikolwiek sposób na zachowanie porządku? – Jeb50

Powiązane problemy