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

MongoDB का उपयोग कर ट्विटर जैसा ऐप

आपके पास दो संभावित तरीके हैं जिनसे एक उपयोगकर्ता दूसरे उपयोगकर्ता का अनुसरण कर सकता है; प्रत्यक्ष या परोक्ष रूप से किसी समूह के माध्यम से, जिस स्थिति में उपयोगकर्ता प्रत्यक्ष समूह का अनुसरण करता है। आइए इन प्रत्यक्ष . को संग्रहीत करने के साथ प्रारंभ करें उपयोगकर्ताओं और समूहों के बीच संबंध:

{
  _id: "userA",
  followingUsers: [ "userB", "userC" ],
  followingGroups: [ "groupX", "groupY" ]
}

अब, आप जल्दी करने में सक्षम होना चाहेंगे पता करें कि उपयोगकर्ता A किस उपयोगकर्ता का अनुसरण कर रहा है, प्रत्यक्ष या अप्रत्यक्ष रूप से। इसे प्राप्त करने के लिए, आप उन समूहों को निरूपित कर सकते हैं जिनका उपयोगकर्ता A अनुसरण कर रहा है। मान लें कि समूह X और Y को इस प्रकार परिभाषित किया गया है:

{
  _id: "groupX",
  members: [ "userC", "userD" ]
},
{
  _id: "groupY",
  members: [ "userD", "userE" ]
}

इन समूहों और उपयोगकर्ता A के प्रत्यक्ष संबंधों के आधार पर, आप सदस्यता . उत्पन्न कर सकते हैं उपयोगकर्ताओं के बीच। सदस्यता के मूल (ओं) को प्रत्येक सदस्यता के साथ संग्रहीत किया जाता है। उदाहरण डेटा के लिए सदस्यताएँ इस तरह दिखाई देंगी:

// abusing exclamation mark to indicate a direct relation
{ ownerId: "userA", userId: "userB", origins: [ "!" ] },
{ ownerId: "userA", userId: "userC", origins: [ "!", "groupX" ] },
{ ownerId: "userA", userId: "userD", origins: [ "groupX", "groupY" ] },
{ ownerId: "userA", userId: "userE", origins: [ "groupY" ] }

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

नक्शा-कम करें

निम्नलिखित मानचित्र-घटाने के कार्य एकल उपयोगकर्ता के लिए सदस्यताएँ उत्पन्न करेंगे।

map = function () {
  ownerId = this._id;

  this.followingUsers.forEach(function (userId) {
    emit({ ownerId: ownerId, userId: userId } , { origins: [ "!" ] });
  });

  this.followingGroups.forEach(function (groupId) {
    group = db.groups.findOne({ _id: groupId });

    group.members.forEach(function (userId) {
      emit({ ownerId: ownerId, userId: userId } , { origins: [ group._id ] });
    });
  });
}

reduce = function (key, values) {
  origins = [];

  values.forEach(function (value) {
    origins = origins.concat(value.origins);
  });

  return { origins: origins };
}

finalize = function (key, value) {
  db.subscriptions.update(key, { $set: { origins: value.origins }}, true);
}

फिर आप एक क्वेरी निर्दिष्ट करके, इस मामले में userA के लिए, किसी एकल उपयोगकर्ता के लिए मैप-रिड्यूस चला सकते हैं ।

db.users.mapReduce(map, reduce, { finalize: finalize, query: { _id: "userA" }})

कुछ नोट्स:

  • उस उपयोगकर्ता के लिए मैप-रिड्यूस चलाने से पहले, आपको किसी उपयोगकर्ता की पिछली सदस्यताओं को हटा देना चाहिए।
  • यदि आप किसी समूह को अपडेट करते हैं, तो आपको समूह का अनुसरण करने वाले सभी उपयोगकर्ताओं के लिए मैप-रिड्यूस चलाना चाहिए।

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्या mongorestore अलग-अलग तर्कों के बजाय एकल url तर्क ले सकता है?

  2. नेवला कस्टम सत्यापन 2 क्षेत्रों का उपयोग कर

  3. $match . के भीतर mongodb एकत्रीकरण क्वेरी में $regex का उपयोग कैसे करें

  4. MongoDB में मौजूदा फ़ील्ड के अंत में एक स्ट्रिंग जोड़ें

  5. मैं कैसे देख सकता हूं कि मोंगो खोल से मोंगो कौन से बंदरगाह सुन रहा है?