2010-09-15 13 views
6

लिंक है एक या अधिक टैग है, तो पहली बार में यह टैग एम्बेड करने प्राकृतिक लग सकता है:आप MongoDB में इन प्रश्नों को कुशलता से कैसे कार्यान्वित करेंगे?

link = { title: 'How would you implement these queries efficiently in MongoDB?' 
     url: 'http://stackoverflow.com/questions/3720972' 
     tags: ['ruby', 'mongodb', 'database-schema', 'database-design', 'nosql']} 

कैसे इन प्रश्नों कुशलता से लागू किया जाएगा?

  • प्राप्त लिंक जो एक या अधिक दिए गए टैग
  • (खोज बॉक्स स्वत: पूर्ण करने के लिए) बिना दोहराव के सभी टैग की एक सूची प्राप्त (दिए गए टैग के साथ लिंक खोज के लिए) होते हैं
  • सबसे लोकप्रिय टैग प्राप्त करें , (शीर्ष 10 टैग या एक टैग बादल प्रदर्शित करने के लिए)

विचार कड़ी के रूप में ऊपर MongoNY presentation पर आधारित होती है करने के लिए स्लाइड 38.

उत्तर

4

लिंक जो "मूल्य" टैग शामिल हो जाओ :

db.col.find({tags: "value"}); 

प्राप्त लिंक जो "VAL1", "val2" टैग शामिल: बिना दोहराव के सभी टैग की

db.col.find({tags: { $all : [ "val1", "val2" ] }}); 

प्राप्त सूची:

db.col.distinct("tags"); 

सबसे लोकप्रिय टैग प्राप्त करें - यह ऐसा कुछ नहीं है जिसे किसी मौजूदा डीबी पर पूछताछ की जा सके, आपको जो करना है, वह एक लोकप्रियता फ़ील्ड को जोड़ता है जब भी कोई क्वेरी दस्तावेज़ लाती है, और फिर लोकप्रियता के लिए सेट सॉर्ट फ़ील्ड के साथ एक क्वेरी करें।

अद्यतन: लोकप्रियता सुविधा के लिए प्रस्तावित समाधान। निम्न संग्रह जोड़ने का प्रयास करें, चलिए इसे टैग करें।

डॉक = {टैग: स्ट्रिंग, पॉप: पूर्णांक}

अब एक बार आप करते हैं एक प्रश्न आप सभी टैग कि दिखाया गया है (इन एकत्रित किया और अतुल्यकालिक रूप से किया जा सकता है) इकट्ठा तो मान लीजिए कि आप के साथ खत्म हो जाने

निम्नलिखित टैग: "टैग 1", "टैग 2", "टैग 3"।

फिर आप अद्यतन विधि कॉल और पॉप फ़ील्ड मान को बढ़ा देते:

db.tags.update({tag: { $in: ["tag1", "tag2", "tag3"] }}, { $inc: { pop: 1 }}); 
+0

एक टैग के लिए एक लोकप्रियता क्षेत्र को जोड़ने के लिए, टैग सही जोड़े जाने के लिए या स्थानांतरित एक अलग संग्रह में, की आवश्यकता होगी: यहाँ एक उदाहरण है? – randomguy

+0

आपको यह नहीं करना है, आप इसे एक ही संग्रह में रख सकते हैं और टैग को इंगित करने के लिए बस एक dbref का उपयोग कर सकते हैं। एक अलग संग्रह आपके डेटा को प्रबंधित करने के लिए बस इतना आसान बना देगा (जो मैं अनुशंसा करता हूं)। – Asaf

+0

टैग संग्रह में मैं एक अलग टैग फ़ील्ड का उपयोग करने के बजाय _id फ़ील्ड में टैग नाम डालने का सुझाव दूंगा। साथ ही, यदि आपको $ टैग का उपयोग करने के बजाय प्रति टैग एक अपडेट करने पर कोई फर्क नहीं पड़ता है, तो आप क्वेरी को केवल {_id: "tag_name"} बना सकते हैं और नई टैग प्रविष्टियां बनाने के लिए अपरर्ट सुविधा का उपयोग कर सकते हैं। – mstearn

0

तुम भी $ addToSet उपयोग कर सकते हैं, जो आपके टैग सरणी के बजाय $ धक्का बदलने के लिए। टैग पहले से मौजूद होने पर दस्तावेज़ को संशोधित नहीं करता है। यदि आप अक्सर अपने टैग संशोधित करते हैं तो यह थोड़ा अधिक कुशल होगा (क्योंकि दस्तावेज़ उतना अधिक नहीं बढ़ेंगे)।

> db.tst_tags.remove() 
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag1'}}, true) 
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag1'}}, true) 
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag2'}}, true) 
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag2'}}, true) 
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag3'}}, true) 
> db.tst_tags.find() 
{ "_id" : ObjectId("4ce244548736000000003c6f"), "name" : "test", 
    "tags" : [ "tag1", "tag2", "tag3" ] } 
संबंधित मुद्दे