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

MongoDb csharp ड्राइवर का उपयोग करके टाइप बदलने पर फ़ील्ड को डिसेरिएलाइज़ करना

एक दो बातें चल रही हैं। मुख्य बात यह है कि आपको किसी भी प्रकार की परवाह किए बिना इनपुट का उपभोग करना होगा या अक्रमांकन प्रक्रिया सिंक से बाहर हो जाती है। मैंने आपके परिदृश्य का परीक्षण ज़िपकोडसेरियलाइज़र नामक एक कस्टम सीरिएलाइज़र लिखते हुए किया है जो नल को संभालता है और ज़िपकोड को स्ट्रिंग के रूप में लिखता है, लेकिन इनपुट पर स्ट्रिंग या इनट्स को स्वीकार करता है और इनट्स को स्ट्रिंग में परिवर्तित करता है।

मैंने इस वर्ग का परीक्षण करने के लिए उपयोग किया:

public class Address
{
    public ObjectId Id;
    public string ZipCode;
}

और यह कस्टम सीरिएलाइज़र मैंने लिखा है:

public class ZipCodeSerializer : BsonBaseSerializer
{
    public override object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
    {
        var bsonType = bsonReader.CurrentBsonType;
        switch (bsonType)
        {
            case BsonType.Null:
                bsonReader.ReadNull();
                return null;
            case BsonType.String:
                return bsonReader.ReadString();
            case BsonType.Int32:
                return bsonReader.ReadInt32().ToString();
            default:
                var message = string.Format("ZipCodeSerializer expects to find a String or an Int32, not a {0}.", bsonType);
                throw new BsonSerializationException(message);
        }
    }

    public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
    {
        if (value == null)
        {
            bsonWriter.WriteNull();
        }
        else
        {
            bsonWriter.WriteString((string)value);
        }
    }
}

आपको यह सुनिश्चित करना होगा कि कस्टम सीरिएलाइज़र जुड़ा हुआ है, जो आप इस तरह कर सकते हैं:

BsonClassMap.RegisterClassMap<Address>(cm =>
    {
        cm.AutoMap();
        cm.GetMemberMap(a => a.ZipCode).SetSerializer(new ZipCodeSerializer());
    });

तो अब पता वर्ग के ज़िपकोड फ़ील्ड को कस्टम सीरिएलाइज़र द्वारा नियंत्रित किया जाएगा।

मैंने अपने परीक्षण संग्रह में डेटा के विशेष संग्रहीत संस्करणों को बाध्य करना आसान बनाने के लिए BsonDocument का उपयोग करके कुछ परीक्षण डेटा बनाया:

collection.Drop();
collection.Insert(new BsonDocument());
collection.Insert(new BsonDocument("ZipCode", BsonNull.Value));
collection.Insert(new BsonDocument("ZipCode", "12345"));
collection.Insert(new BsonDocument("ZipCode", 56789));

यहां बताया गया है कि मोंगो शेल का उपयोग करते हुए दस्तावेज़ कैसा दिखते हैं:

> db.test.find()
{ "_id" : ObjectId("4f871374e447ad238040e346") }
{ "_id" : ObjectId("4f871374e447ad238040e347"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e348"), "ZipCode" : "12345" }
{ "_id" : ObjectId("4f871374e447ad238040e349"), "ZipCode" : 56789 }
>

इसलिए हम देखते हैं कि कुछ ज़िपकोड स्ट्रिंग हैं और कुछ इनट्स हैं (इसमें एक नल भी है)।

और यह मेरा परीक्षण कोड है:

foreach (var document in collection.FindAll())
{
    Console.WriteLine(document.ToJson());
}

और परीक्षण कोड चलाने का आउटपुट है:

{ "_id" : ObjectId("4f871374e447ad238040e346"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e347"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e348"), "ZipCode" : "12345" }
{ "_id" : ObjectId("4f871374e447ad238040e349"), "ZipCode" : "56789" }
Press Enter to continue

ध्यान दें कि ज़िपकोड जो डेटाबेस में एक इंट था अब एक स्ट्रिंग है।

मेरे परीक्षण कार्यक्रम का पूरा स्रोत कोड यहां उपलब्ध है:

http://www.pastie.org/3775465




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. कुल मिलाकर करते समय MongoDB गलत अनुक्रमणिका का चयन करता प्रतीत होता है

  2. स्पार्क के माध्यम से मोंगो डीबी से कनेक्ट नहीं हो सकता

  3. एक उल्का ऐप का डेटाबेस जो एक बार चलाया गया है (और कभी लोड नहीं हुआ) लगभग 3GB क्यों ले रहा है?

  4. टॉमकैट के साथ मोंगोडीबी जावा ड्राइवर डेटाबेस कनेक्शन पूलिंग

  5. फेसबुक एपीआई से उल्का में डेटा डालें