2011-08-07 10 views
6

Mam problemy podczas próby dodawania typów złożonych do istniejących dokumentów w Mongo.Dodawanie złożonych klas do Mongo

Mam następujące dwie klasy.

public class UserObjectCollection { 

    [BsonId] 
    public Guid UserId { get; set; } 

    public Dictionary<string, object> UserObjects { get; set; } 

    public UserObjectCollection() { 
     UserObjects = new Dictionary<string, object>(); 
    } 
} 

public class ComplexClass { 
    public string Bar { get; set; } 
    public int Foo { get; set; } 
} 

Następnie utworzę nowy obiekt do wstawienia.

var bd = new UserObjectCollection() { 
    UserId = Guid.NewGuid(), 
    UserObjects = { 
     { "data", 12 }, 
     { "data2", 123 }, 
     { "data3", new ComplexClass() { Bar= "bar", Foo=1234 } } 
    } 
}; 

Włóż dokument.

mongoCollection.Insert(bd.ToBsonDocument()); 

I otrzymuję wynikowy dokument.

{ "_id": BinData (3 "t089M1E1j0OFVS3YVuEDwg =="), "UserObjects": { "DATA": 12, "data2": 123, "danych3": { "'t": "ComplexClass" "Bar": "bar", "Foo": 1234} }}

Dokument jest wstawiany poprawnie. Następnie modyfikuję jedną z wartości.

var query = Query.EQ("UserObjects.data", BsonValue.Create(12)); 

collection.FindAndModify(
    query, 
    SortBy.Null, 
    Update.SetWrapped<ComplexClass>("data2", new ComplexClass() { Foo = -1234, Bar = "FooBar" }), 
    returnNew: false, 
    upsert: true); 

Dokument wyświetlany w bazie danych.

{"UserObjects": {"data": 12, "data2": {"Bar": "FooBar", "Foo": -1234}, "data3": {"_t": "ComplexClass" , "Bar": "bar", "Foo": 1234}}, "_id": BinData (3, "W11Jy + hYqE2nVfrBdxn54g ==")}

Jeśli spróbuję pobrać ten rekord, otrzymuję wyjątek FileFormatException .

var theDocument = collection.Find(query).First(); 

(Nieobsłużone Wyjątek System.IO.FileFormatException: Nie można określić rzeczywistej ţ ODZAJ przedmiotu deserializowania NominalType jest System.Object i BsonType jest Docum Ent..).

W przeciwieństwie do danych3, data2 nie ma dyskryminatora. Co ja robię?

Odpowiedz

4

Dobrze, jeśli kierowca chce dyskryminator można dać go, oddając swoją klasę do obiektu w aktualizacji:

(object)(new ComplexClass() { Foo = -1234, Bar = "FooBar" }) 

to rozwiąże problem.

BTW, twój aktualizacja nie faktycznie aktualizowanie pola dane2 ciągu UserObjects, to stworzenie nowego pola dane2 wewnątrz dokumentu następujący kod powinien działać poprawnie:

Update.SetWrapped<ComplexClass>("UserObjects.data2", 
         new ComplexClass() { Foo = -1234, Bar = "FooBar" }), 
2

Deserializator nie może sam dowiedzieć się, jakiego typu powinien używać na podstawie reprezentacji Bsona. Spójrz na moje pytanie kilka dni temu. Myślę, że wyjaśnia to kilka rzeczy. Wdrożenie BsonSerializable rozwiązałoby problem.

Storing composite/nested object graph

Powiązane problemy