2016-01-27 7 views
9

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

This दिखाता है कि प्रकाशन के समय संग्रह पर transform फ़िल्टर कैसे जोड़ें। हालांकि, मुझे यकीन नहीं है कि transform एक ऐसे क्षेत्र की गणना करने के लिए एक कुशल दृष्टिकोण है जिसे मैं इस प्रकार उपयोग करना चाहता हूं ..

अंत में, यह मोंगो मानचित्र का उपयोग करने के लिए बहुत ही शानदार होगा, गणना के आधार पर अनुशंसित आइटमों को तुरंत वापस करने के लिए स्कोर, जो समानांतर में किया जा सकता है।

@ ब्रेट-मैक्लेन pointed out शुद्ध मोंगो में कुछ नक्शा सॉर्टिंग कैसे कम किया जा सकता है। 0eपैकेज out there मीटरी संग्रह का विस्तार करने के लिए हैं, लेकिन मुझे यह नहीं मिला कि मेटीर प्रकाशन (एक विधि में बनाम) में उनका उपयोग कैसे करें, here मानचित्र को कम करने के लिए आउटपुट अन्य संग्रह को भेज दिया जाता है जो हर बार स्पष्ट रूप से अधिलेखित होता है विधि कहा जाता है।

यहाँ मोटे तौर पर तर्क मैं प्राप्त करना चाहते हैं:

/* Server */ 
Meteor.publish('getRecommendedItems', function() { 
    var u = Users.findOne(this.userId); 
    var scoreItem = function(item, u) { ... }; 
    return Items.find(
    {}, 
    { 
     transformInParallel: function(doc) { 
     doc.score = scoreItem(doc); 
     }, 
     sort: {score: -1}, 
     limit: 10, 
    } 
); 
}); 


/* Client template*/ 
Template.templateName.onCreated(function() { 
    this.subscribe('getRecommendedItems'); 
    this.items = Items.find({}, sort: {score: -1}); 
}); 

जहाँ मैं score को छोड़कर कोई गणना कर के बिना ग्राहक में पहुंच योग्य।

Meteor.methods में कस्टम चीजें करना आसान लगता है, लेकिन Meteor.publish ऐसा करने के लिए प्राकृतिक जगह की तरह लगता है; क्योंकि यह वह जगह है जहां उल्का की जादुई प्रतिक्रियाशीलता होती है।

+0

(http://stackoverflow.com/questions/22728668/sorting-mongodb-by-reddit-ranking-algorithm) [reddit रैंकिंग एल्गोरिथ्म द्वारा MongoDB छंटाई] की संभावित डुप्लिकेट –

+1

मैं डुप्लीकेट के रूप में यह चिह्नित किए जाने और लिंक करने के बाद MongoDB में सॉर्ट करके Reddit के समय क्षय एल्गोरिदम लागू करने के बारे में एक स्टैक ओवरफ्लो प्रश्न के लिए। उनका समाधान मानचित्र को कम करने के लिए है: http://stackoverflow.com/questions/22728668/sorting-mongodb-by-reddit-ranking-algorithm –

+0

यह एक बहुत ही रोचक पोस्ट है। मैं सोच रहा हूं कि मैं उल्का ढांचे के भीतर उन मोंगो संचालन कैसे कर सकता हूं। मेरी समझ यह है कि उल्का एक परत जोड़ती है जो क्लाइंट को लाइव अपडेट प्रदान करती है, और स्पष्ट रूप से ऑपरेशन को प्रतिबंधित करती है जो इस परिणाम को प्राप्त करने के लिए कर सकती है। एक उल्का संग्रह से, '' की तरह ध्यान दे रहा है।mapReduce' मुझे बताएं कि मुझे कुछ याद आ रहा है, अन्यथा मैं – Guig

उत्तर

0
transformInParallel: function(doc) { 
    doc.score = scoreItem(doc); 
    }, 
    sort: {score: -1}, 
    limit: 10, 

यह एक पूर्ण डेटाबेस स्कैन का परिणाम देगा।

समय-क्षय समाधान, जो वास्तव में सामान्य प्रोग्रामिंग परीक्षण प्रश्न हैं, आपके उपयोग के मामले में वास्तव में उपयुक्त नहीं हैं।

अपने पैमाने छोटा है, तो बस एक अलग संग्रह में

{score: ..., userId: ..., item: ...} 

दस्तावेजों का एक पूरा सेट precompute। इन तरह के एक अरब छोटे दस्तावेज़ों के सूचकांक पूरी तरह से एक डेटाबेस सर्वर की रैम में फिट होंगे; यह सबसे अधिक उपयुक्त के लिए उपयुक्त होगा 30,000 आइटम और 30,000 उपयोगकर्ता।

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

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