5

我正在尝试在 nodejs 中的集合上迭代不同的 ID。可以像以下代码一样工作的东西:

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

到目前为止,最好的想法是在我的模式中添加一个链表,这样我就可以在下一个对特定 ID 的引用上调用 find(),但我希望有一些不那么“棘手”的东西,可以让我使用这个 Mongoose 引用 (thisPost)作为我的 find() 可以开始的光标。

谢谢

编辑:迭代旨在处理多个页面查询。更好的例子:

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

1 回答 1

11

您可能会查看 Mongoose 的流媒体功能:

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

返回的QueryStreamstream()继承自Node.js 的 Stream,因此您可以根据需要使用pause和做一些有趣的事情。resume

[编辑]

现在我对您的问题有了更多了解,我想说 QueryStream 可能不是您想要使用的。我今天做了一些工作,并在https://gist.github.com/3453567获得了一个可行的解决方案;只需克隆 Gist ( git://gist.github.com/3453567.git),然后运行npm install,然后node index.js您应该能够访问位于http://localhost:3000. 刷新页面应该会给你“下一个”报价,当你到达最后它应该环绕。

这之所以有效,是因为有几件事:

首先,我们在用户的数据中保存对用户“上次查看”报价的引用

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

现在,当我们这样做时User.findOne().populate('lastQuote'),返回的 User 上的lastQuote属性将是一个实际的 Quote 对象,由存储在 MongoDB 中的字段的值(它是一个 ObjectId)引用。

next()由于以下代码,我们可以调用此 Quote 对象:

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

这是找到下一个引号或环绕到第一个引号的部分。

查看代码,如果您有任何问题,请告诉我。

于 2012-08-23T18:13:25.623 回答