2010-10-01 11 views
9

मैं क्या जरूरत है:MongoDB के साथ एक ट्विटर की तरह समय बनाना

मान लीजिए आप MongoDB का उपयोग कर रहे हैं और आप एक संग्रह users कहा जाता है, और प्रत्येक उपयोगकर्ता उपयोगकर्ता के साथ एक "निम्न" सरणी के _id रों वे लोग अनुसरण कर रहे हैं। फिर आपके पास statuses का एक और संग्रह है, जिसमें प्रत्येक लेखक के _id शामिल हैं। आप किसी निश्चित उपयोगकर्ता को उन लोगों द्वारा जोड़े गए सभी स्थितियों को कैसे प्रदर्शित करते हैं, जिनका वह अनुसरण कर रहा है?

मैं क्या करने की कोशिश की:

मैं सभी उपयोगकर्ताओं _id रों कि वर्तमान उपयोगकर्ता एक सरणी (मैं PHP का उपयोग कर रहा) में पीछा कर रहा है, तो मैं इसका इस्तेमाल किया उन उपयोगकर्ताओं द्वारा सभी स्थितियों को खोजने के लिए डाल दिया $in का उपयोग कर।

प्रश्न:

इस सबसे अच्छा समाधान है?

उत्तर

3

मैं किसी अन्य तरीके से भी नहीं देख सकता, मैंने पहले ऐसी चीज लागू की थी और कोई समस्या नहीं थी।

अपने मामले पर यह इस प्रकार की तरह sth किया जाना चाहिए, आप अपने कार्य करने के लिए एक तर्क के रूप में कुछ उपयोगकर्ता के $follower_ids सरणी पारित:

$query = array("status_owner_id" => array('$in' => $follower_ids)); 
$cursor = $mongo->yourdb->statuses->find($query); 

और अगर आप सूचकांक स्थितियों (यदि आप ऐसा करने के लिए पर्याप्त राम किया है) owner_id पर आपको परिणाम वास्तव में तेज़ी से मिलेंगे।

उम्मीद है कि यह मदद करता है, सिनन।

0

तुम क्या करने की कोशिश की क्या हर शरीर पहले लगता है लेकिन यह पैमाने पर करने के ... तुम हमेशा अधिक सर्वर जोड़ने के लिए या sharding आदि का उपयोग कर सकते हैं ... आप उपयोगकर्ताओं और लोगों के लाख है, तो वास्तव में आसान नहीं है जो बहुत से लोगों का पालन करते हैं, यह समाधान निष्पादित करना वास्तव में कठिन हो जाएगा।

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

आपके पास एक उपयोगकर्ता संग्रह होगा, प्रत्येक उपयोगकर्ता के पास एक स्टेटस सरणी होगी। मान लें कि आपके पास user1 और user2 है, और वह उपयोगकर्ता 1 उपयोगकर्ता 2 का पालन करता है। जब उपयोगकर्ता 2 स्थिति को पुश करता है, तो उसकी स्थिति स्थिति के उपयोगकर्ता 1 सरणी में और स्थिति 2 के उपयोगकर्ता 2 सरणी में सहेजी जाएगी। आप अधिक भंडारण का उपयोग करेंगे जो mongoDB के साथ अधिक स्मृति का मतलब है .... फेसबुक पर वे मुख्य भंडारण के लिए एचबीएएस के साथ हैडोप का उपयोग कर रहे हैं, तो उनके पास बहुत सारी मेमोरी वाले सर्वर के विशाल सरणी हैं।

एक असुविधाजनक यह है कि यदि आप एक स्थिति को हटाते हैं तो आपको इसे हर जगह हटाना होगा ... इस समाधान के लिए प्रमुख लाभ, प्रत्येक उपयोगकर्ता के पास पहले से ही स्थिति की एक श्रृंखला होगी! पिछले समाधान में यदि आप 3users का पालन करते हैं, तो आपको अपने सभी फीड को पकड़ने की आवश्यकता होती है, फिर उन्हें क्रमबद्ध करें ...

[संपादित करें] शेखर की तरह टिप्पणी में इंगित करें, मोंगो के पास एक दस्तावेज़ सीमा है।आपको स्टेटस संग्रह को दो बार सहेजने की जरूरत है, एक बार उपयोगकर्ता 2 के लिए और एक बार उपयोगकर्ता 1 के लिए और आईडी, आईआईडी, स्टेटस, और समय

+0

से प्राप्त करने की आवश्यकता है यह देखते हुए कि मोंगोडीबी में दस्तावेज़ का आकार 16 एमबी से अधिक नहीं हो सकता है । क्या आप सीमा को मार नहीं पाएंगे और अंततः आपको एक नया संग्रह बनाना होगा? – Shekhar

+0

हां वास्तव में ऐसा इसलिए है क्योंकि मेरा उदाहरण फेसबुक से था जो मोंडो डीबी के लिए एचबीएएस का उपयोग करता है, आप एक स्टेटस संग्रह बना सकते हैं, जब उपयोगकर्ता 2 स्थिति को पुश करता है जिसे आप इसे दो बार सहेजते हैं, एक बार उपयोगकर्ता 2 के लिए और उपयोगकर्ता 1 के लिए दूसरी बार, आपके स्टेटस दस्तावेज़ में से एक होगा ID , एक आईआईडी, समय और स्थिति खुद ... – zzarbi

संबंधित मुद्दे