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

किसी वर्ग वस्तु को अनुक्रमणिका के रूप में कैसे सजाएं और सुनिश्चित इंडेक्स का उपयोग करने के समान प्राप्त करें?

मुझे लगता है कि यह एक अच्छा विचार है, लेकिन आपको इसे स्वयं करना होगा, इसके लिए कोई अंतर्निहित समर्थन नहीं है। यदि आपके पास एक्सेस लेयर है तो आप इसे वहां कर सकते हैं। आपको एक विशेषता वर्ग की आवश्यकता होगी, कुछ इस तरह;

public enum IndexConstraints
{
    Normal     = 0x00000001, // Ascending, non-indexed
    Descending = 0x00000010,
    Unique     = 0x00000100,
    Sparse     = 0x00001000, // allows nulls in the indexed fields
}

// Applied to a member
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class EnsureIndexAttribute : EnsureIndexes
{
    public EnsureIndex(IndexConstraints ic = IndexConstraints.Normal) : base(ic) { }
}

// Applied to a class
[AttributeUsage(AttributeTargets.Class)]
public class EnsureIndexesAttribute : Attribute
{
    public bool Descending { get; private set; }
    public bool Unique { get; private set; }
    public bool Sparse { get; private set; }
    public string[] Keys { get; private set; }

    public EnsureIndexes(params string[] keys) : this(IndexConstraints.Normal, keys) {}
    public EnsureIndexes(IndexConstraints ic, params string[] keys)
    {
        this.Descending = ((ic & IndexConstraints.Descending) != 0);
        this.Unique = ((ic & IndexConstraints.Unique) != 0); ;
        this.Sparse = ((ic & IndexConstraints.Sparse) != 0); ;
        this.Keys = keys;
    }

}//class EnsureIndexes

फिर आप निम्न प्रकार से वर्ग या सदस्य स्तर पर विशेषताएँ लागू कर सकते हैं। मैंने पाया कि सदस्य स्तर पर जोड़ने से वर्ग स्तर पर जोड़ने की तुलना में स्कीमा के साथ तालमेल बिठाने की संभावना कम थी। आपको निश्चित रूप से यह सुनिश्चित करने की आवश्यकता है कि आपको C# सदस्य नाम के विपरीत वास्तविक तत्व का नाम मिले;

[CollectionName("People")]
//[EnsureIndexes("k")]// doing it here would allow for multi-key configs
public class Person 
{
    [BsonElement("k")] // name mapping in the DB schema
    [BsonIgnoreIfNull]
    [EnsureIndex(IndexConstraints.Unique|IndexConstraints.Sparse)] // name is implicit here
    public string userId{ get; protected set; }

// other properties go here
}

और फिर आपके डीबी एक्सेस कार्यान्वयन (या भंडार) में, आपको ऐसा कुछ चाहिए;

    private void AssureIndexesNotInlinable()
    {
                // We can only index a collection if there's at least one element, otherwise it does nothing
                if (this.collection.Count() > 0)
                {

                    // Check for EnsureIndex Attribute
                    var theClass = typeof(T);

                    // Walk the members of the class to see if there are any directly attached index directives
                    foreach (var m in theClass.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy))
                    {
                        List<string> elementNameOverride = new List<string>(1);
                        EnsureIndexes indexAttr = null;

                        // For each members attribs
                        foreach (Attribute attr in m.GetCustomAttributes())
                        {
                            if (attr.GetType() == typeof(EnsureIndex))
                                indexAttr = (EnsureIndex)attr;

                            if (attr.GetType() == typeof(RepoElementAttribute))
                                elementNameOverride.Add(((RepoElementAttribute)attr).ElementName);

                            if ((indexAttr != null) && (elementNameOverride.Count != 0))
                                break;
                        }

                        // Index
                        if (indexAttr != null)
                        {
                            if (elementNameOverride.Count() > 0)
                                EnsureIndexesAsDeclared(indexAttr, elementNameOverride);
                            else
                                EnsureIndexesAsDeclared(indexAttr);
                        }
                    }

                    // Walk the atributes on the class itself. WARNING: We don't validate the member names here, we just create the indexes
                    // so if you create a unique index and don't have a field to match you'll get an exception as you try to add the second
                    // item with a null value on that key
                    foreach (Attribute attr in theClass.GetCustomAttributes(true))
                    {
                        if (attr.GetType() == typeof(EnsureIndexes))
                            EnsureIndexesAsDeclared((EnsureIndexes)attr);

                    }//foreach

                }//if this.collection.count

    }//AssureIndexesNotInlinable()

तब सुनिश्चित इंडेक्स इस तरह दिखता है;

    private void EnsureIndexesAsDeclared(EnsureIndexes attr, List<string> indexFields = null)
    {
        var eia = attr as EnsureIndexes;

        if (indexFields == null)
            indexFields = eia.Keys.ToList();

        // use driver specific methods to actually create this index on the collection
        var db = GetRepositoryManager(); // if you have a repository or some other method of your own 
        db.EnsureIndexes(indexFields, attr.Descending, attr.Unique, attr.Sparse);

    }//EnsureIndexes()

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

    void AssureIndexes()
    {
        if (_requiresIndexing)
            AssureIndexesInit();
    }

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. गोलंग / एमजीओ - घबराहट:कोई पहुंच योग्य सर्वर नहीं

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

  3. मोंगोडीबी इंजेक्शन

  4. स्ट्रिंग मान से सफेद रिक्त स्थान (अग्रणी और अनुगामी) निकालना

  5. यदि सरणी में मौजूद है तो MongoDB दस्तावेज़ या वेतन वृद्धि फ़ील्ड सम्मिलित करें