2011-08-07 34 views
6

Tôi gặp sự cố khi cố thêm các loại phức tạp vào các tài liệu hiện có trong Mongo.Thêm các lớp phức tạp vào Mongo

Tôi có hai lớp sau đây.

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

Sau đó, tôi tạo đối tượng mới để chèn.

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

Chèn tài liệu.

mongoCollection.Insert(bd.ToBsonDocument()); 

Và tôi nhận được tài liệu kết quả.

{ "_id": BinData (3, "t089M1E1j0OFVS3YVuEDwg =="), "UserObjects": { "dữ liệu": 12, "data2": 123, "data3": { "_T": "ComplexClass" , "Bar": "bar", "Foo": 1234} }}

Tài liệu chèn chính xác. Sau đó, tôi sửa đổi một trong các giá trị.

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

Tài liệu như xuất hiện trong cơ sở dữ liệu.

{"UserObjects": {"dữ liệu": 12, "dữ liệu2": {"Thanh": "FooBar", "Foo": -1234}, "data3": {"_t": "ComplexClass" , "Bar": "bar", "Foo": 1234}}, "_id": BinData (3, "W11Jy + hYqE2nVfrBdxn54g ==")}

Nếu tôi cố truy xuất bản ghi này, tôi nhận được một FileFormatException .

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

(Unhandled Exception: System.IO.FileFormatException: Không thể xác định thực tế t ype của đối tượng để deserialize NominalType là System.Object và BsonType là Docum ent..).

Không giống như dữ liệu3, dữ liệu 2 không có phân biệt đối xử. Tôi đang làm gì vậy?

Trả lời

4

Được rồi, nếu người lái xe muốn phân biệt bạn có thể cho nó bằng cách đúc lớp học của bạn cho đối tượng trong bản cập nhật:

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

này sẽ giải quyết vấn đề của bạn.

BTW, cập nhật của bạn không thực sự cập nhật lĩnh vực data2 trong UserObjects, nó tạo ra lĩnh vực data2 mới trong tài liệu, sau mã nên làm việc một cách chính xác:

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

Trình Deserializer không thể tự tìm ra loại nó nên được sử dụng dựa trên biểu diễn Bson. Hãy xem câu hỏi của tôi cách đây vài ngày. Tôi nghĩ rằng nó làm rõ một vài điều. Việc triển khai BsonSerializable sẽ giải quyết vấn đề.

Storing composite/nested object graph

Các vấn đề liên quan