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

मोंगोडब में मेल खाने वाली या शर्तों का प्रतिशत

वैसे आपका समाधान वास्तव में मोंगोडीबी विशिष्ट होना चाहिए अन्यथा आप क्लाइंट पक्ष पर अपनी गणना और संभावित मिलान करना समाप्त कर देंगे, और यह प्रदर्शन के लिए अच्छा नहीं होगा।

तो निश्चित रूप से आप जो चाहते हैं वह सर्वर साइड पर उस प्रोसेसिंग के लिए एक तरीका है:

db.products.aggregate([

    // Match the documents that meet your conditions
    { "$match": {
        "$or": [
            { 
                "features": { 
                    "$elemMatch": {
                       "key": "Screen Format",
                       "value": "16:9"
                    }
                }
            },
            { 
                "features": { 
                    "$elemMatch": {
                       "key" : "Weight in kg",
                       "value" : { "$gt": "5", "$lt": "8" }
                    }
                }
            },
        ]
    }},

    // Keep the document and a copy of the features array
    { "$project": {
        "_id": {
            "_id": "$_id",
            "product_id": "$product_id",
            "ean": "$ean",
            "brand": "$brand",
            "model": "$model",
            "features": "$features"
        },
        "features": 1
    }},

    // Unwind the array
    { "$unwind": "$features" },

    // Find the actual elements that match the conditions
    { "$match": {
        "$or": [
            { 
               "features.key": "Screen Format",
               "features.value": "16:9"
            },
            { 
               "features.key" : "Weight in kg",
               "features.value" : { "$gt": "5", "$lt": "8" }
            },
        ]
    }},

    // Count those matched elements
    { "$group": {
        "_id": "$_id",
        "count": { "$sum": 1 }
    }},

    // Restore the document and divide the mated elements by the
    // number of elements in the "or" condition
    { "$project": {
        "_id": "$_id._id",
        "product_id": "$_id.product_id",
        "ean": "$_id.ean",
        "brand": "$_id.brand",
        "model": "$_id.model",
        "features": "$_id.features",
        "matched": { "$divide": [ "$count", 2 ] }
    }},

    // Sort by the matched percentage
    { "$sort": { "matched": -1 } }

])

तो जैसा कि आप $or . की "लंबाई" जानते हैं शर्त लागू की जा रही है, तो आपको बस यह पता लगाना होगा कि "सुविधाओं" सरणी में कितने तत्व उन शर्तों से मेल खाते हैं। तो यही पाइपलाइन में दूसरा $मैच है।

एक बार आपके पास वह गिनती हो जाने के बाद, आप बस उन शर्तों की संख्या से विभाजित करते हैं जो आपके $or के रूप में पारित की गई थीं . यहां की खूबी यह है कि अब आप प्रासंगिकता के आधार पर इस तरह के कुछ उपयोगी काम कर सकते हैं और फिर परिणाम सर्वर साइड पर "पेज" भी कर सकते हैं।

बेशक यदि आप इसका कुछ अतिरिक्त "वर्गीकरण" चाहते हैं, तो आपको बस एक और $project जोड़ना होगा पाइपलाइन के अंत तक का चरण:

    { "$project": {
        "product_id": 1
        "ean": 1
        "brand": 1
        "model": 1,
        "features": 1,
        "matched": 1,
        "category": { "$cond": [
            { "$eq": [ "$matched", 1 ] },
            "100",
            { "$cond": [ 
                { "$gte": [ "$matched", .7 ] },
                "70-99",
                { "$cond": [
                   "$gte": [ "$matched", .4 ] },
                   "40-69",
                   "under 40"
                ]} 
            ]}
        ]}
    }}

या कुछ इसी तरह। लेकिन $cond ऑपरेटर यहां आपकी मदद कर सकता है।

आर्किटेक्चर ठीक होना चाहिए क्योंकि आपके पास यह है क्योंकि आपके पास "की" और "वैल्यू" पर एक कंपाउंड इंडेक्स हो सकता है, जो आपके फीचर एरे में प्रविष्टियों के लिए है और यह प्रश्नों के लिए अच्छी तरह से स्केल होना चाहिए।

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. SQL में अल्पविराम के साथ संख्याओं को कैसे प्रारूपित करें

  2. उच्च उपलब्धता के लिए MongoDB के लिए Percona सर्वर कैसे परिनियोजित करें

  3. Node.js त्रुटि त्रुटि:मॉड्यूल 'नेवला' नहीं खोजा जा सका

  4. पूर्णांक डालने का प्रयास करते समय MongoDB फ्लोट सम्मिलित करता है

  5. संपत्ति मौजूद होने पर नेवला मॉडल की hasOwnProperty झूठी वापसी क्यों करती है?