2012-07-19 11 views
5

पर कॉल करके मैं mongo मूल कनेक्टर के माध्यम से mongodb से जुड़े नोडजेज़ में एक वेब ऐप विकसित कर रहा हूं।कैसे एक नोडज में परिणाम परिणाम - mongodb खोज, लेकिन, गतिशील विधि

यह मेरे लिए ठीक काम करता है:

मेरी js फ़ाइलों में से एक में, मैं पुनः प्राप्त करने के लिए जो भी मैं एक MongoDB संग्रह से की जरूरत है, इस तरह एक "लगता है" या "findOne" आपरेशन आह्वान करने के लिए एक सामान्य विधि है।

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

collection.ensureIndex(indexedFields, function(error, indexName) { 
    if (error) { 
     callback(error); 
    } else { 
     var operation = (params.options.one) ? collection.findOne : collection.find; 

     operation.call(collection, params.selector, params.fields, params.options, 
      function(error, result){ 
       if (error) { 
        ... 
       } else { 
        ... 
       }  
      } 
     ); 
    } 
}); 

एक सरल प्रश्न में, यह इस तरह से होना चाहिए: उदाहरण के लिए:

collection.find().sort({field : 1}), 

मैं कैसे "प्रकार" विधि कॉल करने के, यह मेरी सामान्य तरीके im कर पता नहीं है।

कोई विचार?

धन्यवाद।

+0

क्या आप इसे दे सकते हैं आप जो खोज रहे हैं उसके बारे में थोड़ा और विवरण? –

+0

क्षमा करें, मैंने अपना प्रश्न संशोधित किया। आशा करता हूँ की ये काम करेगा। – larrytron

उत्तर

0

मुझे समाधान मिला है।

ऐसा लगता है कि "toArray" गायब था, अन्यथा काम नहीं करता है।

operation.call(collection, params.selector, params.fields, params.options, function(error, result) { 
if (error) { 
    callback(error); 
} else { 
     result.sort(params.sort).toArray(function(error, items) { 
      ... 
     } 
} 

मैं आशा है कि यह उपयोगी होगा

5

क्या आपने mongojs (https://github.com/gett/mongojs) में देखा है? मैं इसे अपने नोड ऐप्स के लिए उपयोग करता हूं और यह अच्छी तरह से काम करता है (मैं एक्सप्रेसजे का भी उपयोग करता हूं)। आप निम्न सिंटैक्स के साथ तरह से एक सरल खोज कर सकते हैं और:

db.test.find().sort({name:1}, function(error, tuples) { console.log(tuples) }); 
+0

धन्यवाद। यह निश्चित रूप से काम करता है। लेकिन मुझे कुछ और जटिल की जरूरत है। एक पैरा के आधार पर इस विधि को द्विपक्षीय रूप से कॉल करें, (ढूंढें या ढूंढें)। – larrytron

+1

यह कहता है कि सॉर्ट() केवल 1 तर्क लेता है –

+0

यह यूनिक्स टाइमस्टैम्प फ़ील्ड के आधार पर मेरे परिणामों को सबसे पुराने क्रम में क्रमबद्ध करता है: 'articles.find()। Sort ({बनाया: -1})। ToArray()' (वादा का उपयोग करना) वाक्यविन्यास) – agm1984

1

तुम सिर्फ अपने कॉल ?:

 operation.call(collection, params.selector, params.fields, params.options, 
      function(error, result){ 
       ... 
      } 
     ).sort({field: 1}); 

तरह ही कर सकते हैं के उत्पादन के लिए एक ही बात नहीं कर सकते find के परिणामों के लिए आवेदन किया है और नहीं findOne जा, तो यह थोड़ा और अधिक जटिल है:

var operation = (params.options.one) ? collection.findOne : function() { 
     var findResults = collection.find.apply(this, [].slice.call(arguments)); 
     return findResults.sort({field: 1}); 
    }; 

(यही कारण है कि पिछले पूरी तरह से निश्चित रूप से अपरीक्षित, है, लेकिन ऐसा लगता है कि सीएल होना चाहिए ओएसई।)

+0

यह लगभग मुझे चाहिए, लेकिन बिल्कुल नहीं। नए डिटल के साथ नई पोस्ट भेजना। – larrytron

0

यह लगभग स्कॉट ने कहा था।

पहली विधि काम नहीं करती है, क्योंकि सॉर्ट को एक अपरिभाषित वस्तु द्वारा बुलाया जाता है। मुझे लगता है कि यह समझ में आता है, क्योंकि एक कॉलबैक है जो पहले किया जाता है .. दूसरी विधि लगभग मुझे चाहिए, लेकिन काम नहीं कर रही है, एक बार फिर, findResults.sort एक अपरिभाषित लौटाता है।

मैं अंत में कुछ अधिक आसान है, यह सफल होने के लिए लगता है क्या किया है, लेकिन ... वहाँ अभी भी कुछ कमी है:

operation.call(collection, params.selector, params.fields, params.options,    
    function(error, result){ 
     if (err) .... 
     else results.sort({field:1}, callback(err, sortedResults)) 
    } 

अच्छी तरह से, यह "results.sort" पर रुक जाता है, और यह इंतजार कर रहता है .. मुझे नहीं पता कि क्या। mongodb कंसोल को देखते हुए, कोई क्वेरी लॉन्च नहीं की गई है। दूसरी तरफ, कॉलबैक फ़ंक्शन के रूप में मौजूद है, लेकिन इसे नहीं कहा जाता है ...

फिर, मैंने इसे किसी अन्य तरीके से करने की कोशिश की;

var sortedResults = results.sort({field:1}; 
callback(err, sortedResults) 

इस मामले में, निष्पादन जारी रहता है, लेकिन, यह निरस्त परिणाम देता है।

कोई अन्य विचार? यह वहां होना है ....

धन्यवाद

+0

यह अभी भी काम नहीं कर रहा है। कोई उपाय? – larrytron

1

कर्सर सबसे अच्छा समाधान का उपयोग कर रहा है, क्योंकि छंटाई MongoDB इंजन में processeced है

var grades = db.collection('data'); 

var cursor = grades.find(); 
// cursor.skip(1); 
// cursor.limit(4); 
// cursor.sort(['State', 1]); 
cursor.sort([['Temperature', 'desc'],['State','asc']]); 

//var options = { 'skip' : 1, 
//    'limit' : 4, 
//    'sort' : [['grade', 1], ['student', -1]] }; 
//var cursor = grades.find({}, {}, options); 

cursor.each(function(err, doc) { 
    if(err) throw err; 
    if(doc == null) { 
     return db.close(); 
    } 
    console.dir(doc); 
}); 
1

मैं एक लेख मॉडल जहाँ मैं श्रेणी के द्वारा खोज करने के लिए करना चाहते हैं और बनाई गई तारीख के आधार पर नवीनतम लेख प्राप्त करें और इस तरह मैं इसे

const query = {category: "category1"}; 
Articles.find(query, callback).sort({created_date: -1}); 
संबंधित मुद्दे