2011-08-07 7 views
6

मुझे मोंगो में मौजूदा दस्तावेजों में जटिल प्रकार जोड़ने की कोशिश करते समय परेशानी हो रही है।मोंगो में जटिल कक्षाओं को जोड़ना

मेरे पास निम्नलिखित दो वर्ग हैं।

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

मैं फिर सम्मिलन के लिए एक नई वस्तु बना देता हूं।

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

दस्तावेज़ डालें।

mongoCollection.Insert(bd.ToBsonDocument()); 

और मुझे परिणामस्वरूप दस्तावेज़ मिलता है।

{ "_ id": BinData (3, "t089M1E1j0OFVS3YVuEDwg =="), "UserObjects": { "डेटा": 12, "data2": 123, "data3": { "_t": "ComplexClass" , "बार": "बार", "फू": 1234} }}

दस्तावेज़ सही ढंग से सम्मिलित करता है। फिर मैं मानों में से एक को संशोधित करता हूं।

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

दस्तावेज़ में यह दस्तावेज़ में दिखाई देता है।

{"उपयोगकर्ता ऑब्जेक्ट्स": {"डेटा": 12, "डेटा 2": {"बार": "फूबार", "फू": -1234}, "डेटा 3": {"_t": "ComplexClass" , "बार": "बार", "फू": 1234}}, "_id": बिनडाटा (3, "W11Jy + hYqE2nVfrBdxn54g ==")}

यदि मैं इस रिकॉर्ड को पुनर्प्राप्त करने का प्रयास करता हूं, तो मुझे एक फ़ाइलफॉर्मेट अपवाद प्राप्त होता है ।

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

(बिना क्रिया के अपवाद: System.IO.FileFormatException: असमर्थ वास्तविक टी निर्धारित करने के लिए वस्तु के ype deserialize करने के लिए NominalType System.Object है और BsonType Docum ईएनटी है।।)।

डेटा 3 के विपरीत, डेटा 2 में कोई भेदभाव नहीं होता है। मैं क्या कर रहा हूँ?

उत्तर

4

ठीक है, ड्राइवर चाहते हैं discriminator आप इसे अपने वर्ग कास्टिंग अद्यतन में आपत्ति उठाने से दे सकते हैं:

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

यह आपकी समस्या का समाधान होगा।

Btw, अपने अद्यतन वास्तव में UserObjects भीतर data2 क्षेत्र अपडेट नहीं हो, यह दस्तावेज़ के भीतर नई data2 क्षेत्र बनाने, सही ढंग से काम करना चाहिए कोड निम्नलिखित:

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

Deserializer इसे स्वयं नहीं समझ सकता है कि इसे बीसन प्रतिनिधित्व के आधार पर किस प्रकार इस्तेमाल किया जाना चाहिए। कुछ दिन पहले मेरे प्रश्न पर नज़र डालें। मुझे लगता है कि यह कुछ चीजों को स्पष्ट करता है। BsonSerializable लागू करने से समस्या हल हो जाएगी।

Storing composite/nested object graph

संबंधित मुद्दे