2013-02-01 13 views
14

में संग्रह से यादृच्छिक दस्तावेज़ मैं Schema.statics.random फ़ंक्शन बनाना चाहता हूं जो मुझे संग्रह से यादृच्छिक तत्व प्राप्त करे। मुझे पता है कि मूल मोंगोडीबी चालक के लिए एक उदाहरण है, लेकिन मैं इसे मोंगोस में काम नहीं कर सकता।मोंगोस

उत्तर

26

मुझे गिटहुब गिस्ट में यह मोंगोस स्कीमा स्थिर कार्य मिला, जो आपको प्राप्त करने के बाद प्राप्त करना चाहिए। यह संग्रह में दस्तावेज़ों की संख्या की गणना करता है और फिर एक यादृच्छिक राशि छोड़ने के बाद एक दस्तावेज़ देता है।

QuoteSchema.statics.random = function(callback) { 
    this.count(function(err, count) { 
    if (err) { 
     return callback(err); 
    } 
    var rand = Math.floor(Math.random() * count); 
    this.findOne().skip(rand).exec(callback); 
    }.bind(this)); 
}; 

स्रोत: https://gist.github.com/3453567

नायब मैं कोड इसे और अधिक पठनीय बनाने के लिए थोड़ा संशोधित।

+0

कूल। आप जानते हैं कि इसे कॉफीस्क्रिप्ट में कैसे स्थानांतरित किया जा सकता है? – user1680104

+0

नहीं, क्षमा करें! मुझे अभी तक कॉफीस्क्रिप्ट लिखना सीखना है। – matthewtole

+0

ठीक है, यह काम नहीं किया, इसलिए मुझे यकीन नहीं था (यह पहली बार समस्या थी), लेकिन चूंकि मुझे अभी भी इनलाइन जावास्क्रिप्ट के साथ समस्या का सामना करना पड़ रहा है। यह बल्कि अजीब है। फ़ंक्शन के अंदर की सामग्री (कॉलबैक) {} कभी नहीं कहा जाता है। शायद डीबी कनेक्शन के साथ कुछ समस्या है। मैं इसे समझने की कोशिश करूंगा। – user1680104

6

मैंने मोंगोज़ के लिए एक प्लगइन लागू किया है जो 2 डीएसपीयर इंडेक्स का उपयोग करके दो यादृच्छिक रूप से जेनरेट किए गए निर्देशांकों पर $ 1 के पास क्वेरी का उपयोग करके एक बहुत ही कुशल तरीके से करता है। इसे यहां देखें: https://github.com/matomesc/mongoose-random

11

यदि आप अपनी स्कीमा में "परीक्षण जैसे" कोड जोड़ना नहीं चाहते हैं, तो यह मोंगोस क्वेरी का उपयोग करता है।

Model.count().exec(function(err, count){ 

    var random = Math.floor(Math.random() * count); 

    Model.findOne().skip(random).exec(
    function (err, result) { 

     // result is random 

    }); 

}); 
+0

मुझे यह पता लगाने में वास्तव में आसान है – chris31389

+0

एक प्रश्न में एकाधिक दस्तावेज़ों के बारे में कैसे। क्या कई बार पूछताछ के अलावा कोई आसान समाधान है? – codersaif

+0

@codersaif यह वह नहीं है जिसे आप इसके लिए उपयोग करना चाहते हैं। स्किप फ़ंक्शन को पेजिनेशन पर निर्देशित किया जाता है और एक कर्सर है, [mongodb कर्सर] (https://docs.mongodb.com/manual/reference/method/cursor.skip/)। यह कर्सर को एक विशिष्ट स्थिति में ले जायेगा और आगे पढ़ने के लिए है। मेरे उत्तर में कोड मूल रूप से अंकन है, 'Model.findOne()। छोड़ें (100) .limit (1) .exec() 'लेकिन एक ही दस्तावेज़ ला रहा है। –