2012-08-23 36 views
5

Tôi đang cố gắng lặp qua các ID khác nhau trên một bộ sưu tập trong nút. Cái gì mà có thể làm việc như đoạn mã sau:Mongoose - Chuyển đến phần tử tiếp theo

//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' 

nhất ý tưởng cho đến nay sẽ có thêm một linkedlist để schema của tôi vì vậy tôi có thể gọi tìm() trong tài liệu tham khảo tiếp theo của tôi đến một ID cụ thể nhưng tôi đã hy vọng cho một cái gì đó ít 'khéo léo' sẽ cho phép tôi sử dụng tham chiếu Mongoose này (thisPost) như là một con trỏ mà tìm thấy của tôi() có thể bắt đầu từ đó.

Cảm ơn

EDIT: Lặp lại có nghĩa là làm việc trên nhiều truy vấn trang. ví dụ tốt hơn:

//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... 

Trả lời

11

Bạn có thể nhìn vào khả năng truyền Mongoose của:

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, đó là những gì stream() lợi nhuận, được thừa hưởng từ Node.js' Stream, vì vậy bạn có thể làm một số điều thú vị sử dụng pauseresume nếu bạn cần để.

[Chỉnh sửa]

Bây giờ tôi hiểu câu hỏi của bạn nhiều hơn một chút, tôi sẽ nói rằng một QueryStream có lẽ không những gì bạn muốn sử dụng. Tôi đã làm việc này một chút ngày hôm nay và có một giải pháp làm việc tại https://gist.github.com/3453567; chỉ cần sao chép Gist (git://gist.github.com/3453567.git), chạy npm install và sau đó node index.js và bạn sẽ có thể truy cập trang web tại http://localhost:3000. Làm mới trang sẽ cung cấp cho bạn báo giá "tiếp theo" và khi bạn đến hết, nó sẽ được bao quanh.

này hoạt động vì một vài điều:

Đầu tiên, chúng tôi tiết kiệm rất reference đến "cuối cùng xem" quote của người dùng trong dữ liệu của họ:

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

Bây giờ khi chúng ta làm User.findOne().populate('lastQuote'), các lastQuote thuộc tính trên người dùng được trả về sẽ là một đối tượng trích dẫn thực tế được tham chiếu bởi giá trị của trường được lưu trữ trong MongoDB (đó là một ObjectId).

Chúng ta có thể gọi next() trên đối tượng Quote này vì đoạn mã sau:

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); 
    } 
    }); 
}; 

Đây là phần mà thấy báo giá tiếp theo hoặc nếu không kết thúc tốt đẹp xung quanh để báo giá đầu tiên.

Hãy xem mã và cho tôi biết nếu bạn có bất kỳ câu hỏi nào.

+0

Không sử dụng phiên bản này cuối cùng nhưng phải, đánh giá từ tài liệu, luồng là cách tốt nhất để làm những gì tôi muốn. Mặc dù tôi sẽ không sử dụng nó vì nhiều lý do phụ thuộc vào kiến ​​trúc mã hiện tại của ứng dụng của tôi :) – red

+0

Tôi đã sửa đổi câu trả lời của mình dựa trên cập nhật của bạn. –

+0

Chà. Tôi đã thực hiện nó ngày hôm qua bằng cách sử dụng một danh sách liên kết trong cơ sở dữ liệu của tôi, nhưng câu trả lời của bạn rất đơn giản, tôi vô cùng xấu hổ vì không tự nghĩ về nó. Kudos cho suy nghĩ của bạn và một triệu cảm ơn bạn đã trả lời :) – red

Các vấn đề liên quan