MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

BsonSerializationException एक शब्दकोश को क्रमबद्ध करते समय <डेटटाइम, टी> बीएसओएन को

समस्या यह है कि नया ड्राइवर डिफ़ॉल्ट रूप से शब्दकोशों को एक दस्तावेज़ के रूप में क्रमबद्ध करता है।

MongoDB C# ड्राइवर के पास शब्दकोश को क्रमानुसार करने के 3 तरीके हैं:Document , ArrayOfArrays &ArrayOfDocuments (उस पर अधिक दस्तावेज़ों में)। जब यह एक दस्तावेज़ के रूप में क्रमबद्ध होता है तो डिक्शनरी कुंजियाँ BSON तत्व के नाम होती हैं जिनकी कुछ सीमाएँ होती हैं (उदाहरण के लिए, जैसा कि त्रुटि से पता चलता है, उन्हें स्ट्रिंग्स के रूप में क्रमबद्ध किया जाना चाहिए)।

इस मामले में, शब्दकोश की कुंजी हैं DateTime s जो स्ट्रिंग्स के रूप में क्रमबद्ध नहीं हैं, लेकिन Date . के रूप में हैं s इसलिए हमें एक और DictionaryRepresentation choose चुनने की आवश्यकता है ।

इस विशिष्ट संपत्ति के क्रमांकन को बदलने के लिए हम BsonDictionaryOptions . का उपयोग कर सकते हैं भिन्न DictionaryRepresentation . के साथ विशेषता :

[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
public Dictionary<DateTime, int> Dictionary { get; private set; }

हालाँकि, हमें प्रत्येक समस्याग्रस्त सदस्य पर व्यक्तिगत रूप से ऐसा करने की आवश्यकता है। इसे लागू करने के लिए DictionaryRepresentation सभी प्रासंगिक सदस्यों के लिए हम एक नया सम्मेलन लागू कर सकते हैं:

class DictionaryRepresentationConvention : ConventionBase, IMemberMapConvention
{
    private readonly DictionaryRepresentation _dictionaryRepresentation;
    public DictionaryRepresentationConvention(DictionaryRepresentation dictionaryRepresentation)
    {
        _dictionaryRepresentation = dictionaryRepresentation;
    }
    public void Apply(BsonMemberMap memberMap)
    {
        memberMap.SetSerializer(ConfigureSerializer(memberMap.GetSerializer()));
    }
    private IBsonSerializer ConfigureSerializer(IBsonSerializer serializer)
    {
        var dictionaryRepresentationConfigurable = serializer as IDictionaryRepresentationConfigurable;
        if (dictionaryRepresentationConfigurable != null)
        {
            serializer = dictionaryRepresentationConfigurable.WithDictionaryRepresentation(_dictionaryRepresentation);
        }

        var childSerializerConfigurable = serializer as IChildSerializerConfigurable;
        return childSerializerConfigurable == null
            ? serializer
            : childSerializerConfigurable.WithChildSerializer(ConfigureSerializer(childSerializerConfigurable.ChildSerializer));
    }
} 

जिसे हम निम्नानुसार पंजीकृत करते हैं:

ConventionRegistry.Register(
    "DictionaryRepresentationConvention",
    new ConventionPack {new DictionaryRepresentationConvention(DictionaryRepresentation.ArrayOfArrays)},
    _ => true);


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडीबी $mod

  2. नेवला में स्कीमा परिवर्तन से निपटना

  3. MongoDB में दस्तावेज़ों का थोक अद्यतन

  4. MongoDB $gte एकत्रीकरण पाइपलाइन ऑपरेटर

  5. मोंगोडब द्वारा उपयोग किए जाने वाले कैशिंग को कैसे जारी किया जाए?