2012-08-23 14 views
5

मैं नोडज में संग्रह पर विभिन्न आईडी पर फिर से प्रयास करने की कोशिश कर रहा हूं। कुछ ऐसा है जो निम्न कोड की तरह काम करेगा:मोंगोस - अगले तत्व पर जाएं

//Callbacks removed for readability 

var thisPost = mongoose.model('Post').findOne({tags: 'Adventure'}); 
console.log(thisPost.title); // 'Post #1 - Adventure Part 1' 

var nextPost = thisPost.next({tags: 'Adventure'); 
console.log(nextPost.title); // 'Post 354 - Adventure Part 2' 

बेस्ट विचार अब तक() एक विशिष्ट आईडी के लिए अपने स्कीमा के लिए एक linkedlist जोड़ने के लिए मेरी अगली संदर्भ से अधिक तो मैं फोन मिल सकता है हो सकता है, लेकिन मैं कुछ करने के लिए उम्मीद कर रही थी कम 'मुश्किल' जो मुझे इस मोंगोस संदर्भ (इस पोस्ट) को एक कर्सर के रूप में उपयोग करने की अनुमति देगी जहां मेरा खोज() से शुरू हो सकता है।

धन्यवाद

संपादित करें: यात्रा एकाधिक पृष्ठ प्रश्नों पर काम करने के लिए है। बेहतर उदाहरण:

//Callbacks removed for readability 

//User 'JohnDoe' visits the website for the first time 
var thisQuote = mongoose.model('Quote').findOne().skip(Math.rand()); 
res.send(thisQuote); // On page output, JohnDoe will see the quote 42 
//Saving the current quote cursor to user's metadatas 
mongoose.model('User').update({user: 'JohnDoe'}, {$set: {lastQuote: thisQuote }}); 

//User 'JohnDoe' comes back to the website 
var user = mongoose.model('User').findOne({user: 'JohnDoe}); 
var thisQuote = user.lastQuote.next(); 
res.send(thisQuote); // On page output, JohnDoe will see the quote 43 
//Saving the current quote cursor to user's metadatas 
mongoose.model('User').update({user: 'JohnDoe'}, {$set: {lastQuote: thisQuote }}); 

//And so on... 

उत्तर

11

आप नेवला के स्ट्रीमिंग क्षमताओं में दिख सकता है:

var stream = mongoose.model('Post').find({tags: 'Adventure'}).stream(); 

// Each `data` event has a Post document attached 
stream.on('data', function (post) { 
    console.log(post.title); 
}); 

QueryStream है, जो है क्या stream() रिटर्न,, Node.js' Stream से विरासत ताकि आप pause और resume का उपयोग कर कुछ दिलचस्प बातें कर सकते हैं अगर आप करने की जरूरत है।

[संपादित करें]

अब जब कि मैं अपने प्रश्न में थोड़ा और अधिक समझते हैं, मैं कहूँगा कि एक QueryStream शायद नहीं क्या आप उपयोग करना चाहते है। मैंने आज थोड़ा सा काम किया और https://gist.github.com/3453567 पर एक समाधान समाधान मिला; बस गिस्ट क्लोन करें (git://gist.github.com/3453567.git), npm install और फिर node index.js चलाएं और आपको http://localhost:3000 पर साइट पर जाने में सक्षम होना चाहिए। पृष्ठ को रीफ्रेश करने से आपको "अगला" उद्धरण देना चाहिए, और जब आप अंत तक पहुंच जाएंगे तो इसे चारों ओर लपेटना चाहिए।

इसका कारण यह है एक जोड़ी चीजों में से काम करता है:

सबसे पहले, हम अपने डेटा में एक उपयोगकर्ता के "अंतिम बार देखे गए" बोली के लिए एक reference बचाने:

var UserSchema = new mongoose.Schema({ 
    user: String, 
    lastQuote: { type: mongoose.Schema.Types.ObjectId, ref: 'Quote' } 
}); 

अब जब हम User.findOne().populate('lastQuote') करते हैं, lastQuote विशेषता लौटने वाले उपयोगकर्ता पर मोंगोडीबी (जो ऑब्जेक्ट आईडी है) में संग्रहीत फ़ील्ड के मान द्वारा संदर्भित वास्तविक बोली वस्तु होगी।

हम निम्नलिखित कोड की वजह से इस उद्धरण वस्तु पर next() कॉल कर सकते हैं:

QuoteSchema.methods.next = function(cb) { 
    var model = this.model("Quote"); 
    model.findOne().where('_id').gt(this._id).exec(function(err, quote) { 
    if (err) throw err; 

    if (quote) { 
     cb(null, quote); 
    } else { 
     // If quote is null, we've wrapped around. 
     model.findOne(cb); 
    } 
    }); 
}; 

यह हिस्सा है कि अगले बोली पाता है या फिर पहले उद्धृत करने के लिए इर्द-गिर्द घूमती है।

कोड पर नज़र डालें और यदि आपके कोई प्रश्न हैं तो मुझे बताएं।

+0

अंत में इस संस्करण का उपयोग नहीं किया था, लेकिन हाँ, प्रलेखन से निर्णय लेते हुए, स्ट्रीम जो मैं चाहता हूं उसे करने का सबसे अच्छा तरीका है। हालांकि मैं अपने ऐप के वर्तमान कोड आर्किटेक्चर पर निर्भर कई कारणों से इसका उपयोग नहीं करूँगा :) – red

+0

मैंने आपके अपडेट के आधार पर अपना उत्तर संशोधित कर दिया है। –

+0

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

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