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

MongoDB - दस्तावेजों के भीतर स्ट्रिंग्स के मिलान के लिए एग्रीगेशन फ्रेमवर्क या मैप्रिडस का उपयोग करें (प्रोफाइल मिलान)

MapReduce जावास्क्रिप्ट को एक अलग थ्रेड में चलाएगा और आपके द्वारा प्रदान किए गए कोड का उपयोग कुछ क्षेत्रों पर एकत्रित करने के लिए आपके दस्तावेज़ के कुछ हिस्सों को उत्सर्जित करने और कम करने के लिए करेगा। आप निश्चित रूप से अभ्यास को प्रत्येक "फ़ील्डवैल्यू" पर एकत्रित करने के रूप में देख सकते हैं। एग्रीगेशन फ्रेमवर्क भी ऐसा कर सकता है, लेकिन यह बहुत तेज होगा क्योंकि एग्रीगेशन एक अलग जावास्क्रिप्ट थ्रेड के बजाय सर्वर पर C++ में चलेगा। लेकिन एग्रीगेशन फ्रेमवर्क 16MB से अधिक डेटा वापस लौटा सकता है, इस स्थिति में आपको डेटा सेट का अधिक जटिल विभाजन करने की आवश्यकता होगी।

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

> db.profiles.find().forEach( function(p) { 
       print("Matching profiles for "+tojson(p));
       printjson(
            db.profiles.find(
               {"fieldValues": {"$in" : p.fieldValues},  
                                "_id" : {$gt:p._id}}
            ).toArray()
       ); 
 }  );

आउटपुट:

Matching profiles for {
    "_id" : 1,
    "firstName" : "John",
    "lastName" : "Smith",
    "fieldValues" : [
        "favouriteColour|red",
        "food|pizza",
        "food|chinese"
    ]
}
[
    {
        "_id" : 2,
        "firstName" : "Sarah",
        "lastName" : "Jane",
        "fieldValues" : [
            "favouriteColour|blue",
            "food|pizza",
            "food|mexican",
            "pets|yes"
        ]
    },
    {
        "_id" : 3,
        "firstName" : "Rachel",
        "lastName" : "Jones",
        "fieldValues" : [
            "food|pizza"
        ]
    }
]
Matching profiles for {
    "_id" : 2,
    "firstName" : "Sarah",
    "lastName" : "Jane",
    "fieldValues" : [
        "favouriteColour|blue",
        "food|pizza",
        "food|mexican",
        "pets|yes"
    ]
}
[
    {
        "_id" : 3,
        "firstName" : "Rachel",
        "lastName" : "Jones",
        "fieldValues" : [
            "food|pizza"
        ]
    }
]
Matching profiles for {
    "_id" : 3,
    "firstName" : "Rachel",
    "lastName" : "Jones",
    "fieldValues" : [
        "food|pizza"
    ]
}
[ ]

स्पष्ट रूप से आप पहले से मेल खाने वाले प्रोफाइल को बाहर न करने के लिए क्वेरी को बदल सकते हैं ({$gt:p._id} बदलकर करने के लिए {$ne:{p._id}} और अन्य ट्विक्स। लेकिन मुझे यकीन नहीं है कि एकत्रीकरण ढांचे या मैप्रिडस का उपयोग करने से आपको क्या अतिरिक्त मूल्य मिलेगा क्योंकि यह वास्तव में अपने किसी एक क्षेत्र पर एक संग्रह एकत्र नहीं कर रहा है (आपके द्वारा दिखाए गए आउटपुट के प्रारूप के आधार पर)। यदि आपकी आउटपुट स्वरूप आवश्यकताएँ लचीली हैं, तो निश्चित रूप से यह संभव है कि आप बिल्ट इन एग्रीगेशन विकल्पों में से किसी एक का भी उपयोग कर सकें।

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

> db.profiles.aggregate({$unwind:"$fieldValues"}, 
      {$group:{_id:"$fieldValues", 
              matchedProfiles : {$push:
               {  id:"$_id", 
                  name:{$concat:["$firstName"," ", "$lastName"]}}},
                  num:{$sum:1}
               }}, 
      {$match:{num:{$gt:1}}});
{
    "result" : [
        {
            "_id" : "food|pizza",
            "matchedProfiles" : [
                {
                    "id" : 1,
                    "name" : "John Smith"
                },
                {
                    "id" : 2,
                    "name" : "Sarah Jane"
                },
                {
                    "id" : 3,
                    "name" : "Rachel Jones"
                }
            ],
            "num" : 3
        }
    ],
    "ok" : 1
}

यह मूल रूप से कहता है "प्रत्येक फ़ील्ड के लिए फ़ील्ड वैल्यू ($अनविंड) समूह फ़ील्डवैल्यू से मेल खाने वाली प्रोफ़ाइल _ids और नामों की एक सरणी, यह गिनता है कि प्रत्येक फ़ील्ड कितने मिलान करता है, वैल्यू जमा होता है ($ समूह) और फिर उन लोगों को बाहर कर दें जिनके पास केवल एक प्रोफ़ाइल से मेल खाता है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Node.js और MongoDB समय क्षेत्र समस्या UTC ड्राइवर द्वारा सही ढंग से परिवर्तित नहीं किया जा रहा है?

  2. संदेश माता-पिता के अंदर संदेश उत्तर एम्बेड करना mongodb का उपयोग करके mongodb के साथ

  3. ऊपर MongoDB 3.3.0 में QueryBuilder और BasicDBObjectBuilder का उपयोग

  4. मोंगोडब जावा ड्राइवर - कच्चा आदेश?

  5. उल्का संग्रह सही ढंग से परिवर्तनों का निरीक्षण करता है