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

रेगेक्स क्वेरी के साथ सरणी फ़ील्ड पर मोंगोडब अलग है?

एकत्रीकरण ढांचा और नहीं .distinct() आदेश:

db.event.aggregate([
    // De-normalize the array content to separate documents
    { "$unwind": "$tags" },

    // Filter the de-normalized content to remove non-matches
    { "$match": { "tags": /foo/ } },

    // Group the "like" terms as the "key"
    { "$group": {
        "_id": "$tags"
    }}
])

रेगेक्स की शुरुआत में आप "एंकर" का उपयोग करने के लिए शायद बेहतर हैं, क्या आपका मतलब स्ट्रिंग की "शुरुआत" से है। और यह भी करना $match इससे पहले कि आप $unwind को प्रोसेस करें साथ ही:

db.event.aggregate([
    // Match the possible documents. Always the best approach
    { "$match": { "tags": /^foo/ } },

    // De-normalize the array content to separate documents
    { "$unwind": "$tags" },

    // Now "filter" the content to actual matches
    { "$match": { "tags": /^foo/ } },

    // Group the "like" terms as the "key"
    { "$group": {
        "_id": "$tags"
    }}
])

यह सुनिश्चित करता है कि आप $unwind को प्रोसेस नहीं कर रहे हैं। संग्रह में प्रत्येक दस्तावेज़ पर और सुनिश्चित करने के लिए "फ़िल्टर" करने से पहले केवल वे जिनमें आपके "मिलान टैग" मान हो सकते हैं।

संभावित मैचों के साथ बड़े सरणियों को कुछ हद तक कम करने का वास्तव में "जटिल" तरीका थोड़ा अधिक काम लेता है, और MongoDB 2.6 या अधिक:

db.event.aggregate([
    { "$match": { "tags": /^foo/ } },
    { "$project": {
        "tags": { "$setDifference": [
            { "$map": {
                "input": "$tags",
                "as": "el",
                "in": { "$cond": [
                    { "$eq": [ 
                        { "$substr": [ "$$el", 0, 3 ] },
                        "foo"
                    ]},
                    "$$el",
                    false
                ]}
            }},
            [false]
        ]}
    }},
    { "$unwind": "$tags" },
    { "$group": { "_id": "$tags" }}
])

तो $map सरणियों का एक अच्छा "इन-लाइन" प्रोसेसर है लेकिन यह केवल इतनी दूर तक जा सकता है। $setDifference ऑपरेटर false को नकारता है मेल खाता है, लेकिन अंततः आपको अभी भी $unwind . को संसाधित करने की आवश्यकता है बाकी $group करने के लिए समग्र रूप से विशिष्ट मूल्यों के लिए मंच।

यहाँ लाभ यह है कि सरणियाँ अब केवल "टैग" तत्व से "कम" हो जाती हैं जो मेल खाती हैं। जब आप एक ही दस्तावेज़ में "एकाधिक विशिष्ट" मान होते हैं तो घटनाओं की "गिनती" चाहते हैं, तो इसका उपयोग न करें। लेकिन फिर, इससे निपटने के और भी तरीके हैं।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. दस्तावेज़ को उप-दस्तावेज़ सरणी में कैसे जोड़ें - Java/MongoDB

  2. क्या मैं रूबी कक्षाओं का डेटाबेस बना सकता हूं?

  3. क्या MongoDB और उसके ड्राइवर दस्तावेज़ तत्वों के क्रम को सुरक्षित रख सकते हैं

  4. मोंगोडब समूह और उपसमूह मायने रखता है

  5. 32 बिट सिस्टम-मोंगोडीबी में जर्नलिंग सक्षम डीबी का उपयोग करना चाहते हैं