2011-12-09 27 views
7

मुझे एक संदेश प्रणाली बनाने की आवश्यकता है, जहां एक व्यक्ति कई उपयोगकर्ताओं के साथ बातचीत कर सकता है। उदाहरण के लिए मैं उपयोगकर्ता 2, उपयोगकर्ता 3 और उपयोगकर्ता 4 के साथ बात करना शुरू कर देता हूं, इसलिए उनमें से कोई भी संपूर्ण वार्तालाप देख सकता है, और यदि वार्तालाप किसी भी समय निजी नहीं है तो कोई भी भागीदार बातचीत में किसी अन्य व्यक्ति को जोड़ सकता है।mongodb सीमा

मेरा विचार यह है कि यह कैसे करें। मैं मोंगो का उपयोग कर रहा हूं और मेरा विचार संदेश के बजाय संवाद के रूप में संवाद का उपयोग करना है। - एक बड़ा डेटाबेस में यह कुछ विशेष बातचीत के लिए संदेशों को खोजने के लिए आसान हो जाएगा

{ 
_id : ...., // dialog Id 
'private' : 0 // is the conversation private 
'participants' : [1, 3, 5, 6], //people who are in the conversation 
'msgs' :[ 
    { 
    'mid' : ...// id of a message 
    'pid': 1, // person who wrote a message 
    'msg' : 'tafasd' //message 
    }, 
    .... 
    { 
    'mid' : ...// id of a message 
    'pid': 1, // person who wrote a message 
    'msg' : 'tafasd' //message 
    } 
] 
} 

मैं इस दृष्टिकोण के लिए कुछ पेशेवरों देख सकते हैं:

स्कीमा इस प्रकार सूचीबद्ध किया गया है। - बातचीत में लोगों को जोड़ना आसान होगा।

लेकिन यहां एक समस्या है, जिसके लिए मुझे कोई समाधान नहीं मिल रहा है: वार्तालाप बहुत लंबा हो रहा है (उदाहरण के रूप में स्काइप लें) और वे आपको सभी वार्तालाप नहीं दिखा रहे हैं, वे आपको एक हिस्सा दिखा रहे हैं और बाद में वे आपको अतिरिक्त संदेश दिखा रहे हैं। अन्य परिस्थितियों में छोड़ें, सीमा हल करने के मामले में, लेकिन मैं इसे यहां कैसे कर सकता हूं?

यदि यह असंभव है तो आपके पास क्या सुझाव हैं?

उत्तर

13

The MongoDB docs एक सरणी तत्व के उप-श्रेणी का चयन करने का तरीका बताएं।

db.dialogs.find({"_id": [dialogId]}, {msgs:{$slice: 5}}) // first 5 comments 
db.dialogs.find({"_id": [dialogId]}, {msgs:{$slice: -5}}) // last 5 comments 
db.dialogs.find({"_id": [dialogId]}, {msgs:{$slice: [20, 10]}}) // skip 20, limit 10 
db.dialogs.find({"_id": [dialogId]}, {msgs:{$slice: [-20, 10]}}) // 20 from end, limit 10 

आप इस तकनीक का उपयोग केवल आपके यूआई के लिए प्रासंगिक संदेशों का चयन करने के लिए कर सकते हैं। हालांकि, मुझे यकीन नहीं है कि यह एक अच्छा स्कीमा डिज़ाइन है। आप "संग्रहीत" संदेशों से "दृश्यमान" संदेशों को अलग करने पर विचार करना चाह सकते हैं। यह पूछताछ थोड़ा आसान/तेज कर सकता है।

+0

कोई समस्या नहीं। अगर मेरी प्रतिक्रिया ने आपकी समस्या से आपकी सहायता की है, तो कृपया उत्तर को चयनित के रूप में चिह्नित करें। यह मुझे अंक देगा, और भविष्य में उपयोगकर्ताओं को आपके प्रश्नों का उत्तर देने की अधिक संभावना देगा :) – jmacinnes

+0

बहुत उपयोगी धन्यवाद !!! – webmaster

1

चेतावनियां अगर अपनी बातचीत में कई कई संदेश होगा रहे हैं: आप संदेशों सरणियों टुकड़ा करने की क्रिया पर महत्वपूर्ण प्रदर्शन कमी के संकेत मिल के रूप में MongoDB उन सभी को लोड करना होगा

  1. और ड्राइवर के लिए वापसी से पहले सूची काट जाएगा केवल ।
  2. दस्तावेज़ आकार सीमा (अब के लिए 16 एमबी) है जो संभवतः इस दृष्टिकोण से पहुंचा जा सकता है।

मेरे सुझाव है:

  1. उपयोग दो संग्रह: बातचीत के लिए एक और संदेशों के लिए अन्य।
  2. बातचीत में संदेशों में dbref का उपयोग करें (उपयोगकर्ता अनुरोध पर पुरानी श्रेणियों का चयन करने में सक्षम होने के लिए संदेश टाइमस्टैम्प के साथ इस फ़ील्ड को इंडेक्स करें)।
  3. अतिरिक्त बातचीत capped collection प्रत्येक बातचीत के लिए अलग-अलग उपयोग करें।

    • आप सभी संदेशों को दो बार लिखने के लिए करना होगा: यह नाम से यह आसानी से मिल अगर आप इसे "conversation_"

परिणाम की तरह का निर्माण किया जाएगा। लेकिन अलग संग्रह में जो सामान्य है।

  • जब आप अपनी बातचीत दिखाना चाहते हैं तो आपको natural sort order में एक संग्रह से सभी डेटा चुनने की आवश्यकता होगी जो बहुत तेज़ है।
  • आपके कैप्ड किए गए संग्रह स्वचालित रूप से अंतिम संदेश स्टोर करेंगे और पुराने को हटा देंगे।
  • आप मुख्य संदेश संग्रह पूछकर उपयोगकर्ता अनुरोध पर पुराने संदेश दिखा सकते हैं।
  • +0

    @ सल्वाडोरडाली आपको बड़ी संख्या में संग्रहों से डरने की आवश्यकता नहीं है। सही का चयन करना बहुत तेज़ है और उस संख्या पर कोई सैद्धांतिक सीमा नहीं है। लेकिन आप सही हैं कि संग्रह की इतनी बड़ी संख्या का समर्थन करना मुश्किल होगा। अब मैं बातचीत पर अतिरिक्त सूचकांक के साथ एक विशाल कैप्ड संग्रह का उपयोग करने का सुझाव देने जा रहा हूं। ऐसे मामले में दो अतिरिक्त मुद्दे होंगे: कुछ पुरानी बातचीत किसी भी पिछले संदेश के बिना लोड हो जाएगी और कैप्ड संग्रह में इंडेक्स रखना बहुत अच्छा नहीं है। – lig

    +0

    अगर उन्हें किसी अन्य डीबी में अलग किया जाएगा तो बड़ी संख्या में संग्रहों से निपटना आसान होगा। दस्तावेज़ आकार पर बोलते हुए। आकार में लगभग 1 एमबी आकार वाले विशाल दस्तावेज़ों का समूह भी अच्छा नहीं है। क्योंकि यह ड्राइवर प्रदर्शन, प्रतिकृति और sharding प्रदर्शन को कम करेगा। व्यक्तिगत रूप से मैं कभी भी एक दस्तावेज़ में वार्तालाप संग्रहित नहीं करूंगा। कई संभावित मुद्दे हैं: संदेशों को खोजना, साझा करना या एकल संदेश की प्रतिलिपि बनाना आदि। – lig

    +1

    4 साल बाद ... यह एक भयानक जवाब था ... – lig