关于可用于mongoose查询的可滚动游标的错误

用户模型contian SubscriptionSchema和AccessToken Schema,我也用{capped : 234556}定义了这两个插件模式。

  var User = new Schema({ email : String , firstName : String , password : String , isAdmin : Boolean , lastSeen : Date , subscriptions : [ SubscriptionSchema ] , accessTokens : [ AccessToken ] }, { toObject : { virtuals : true } , toJSON : { virtuals : true } , capped : 234556 }); var streamTest = User.find().limit(1).tailable().stream(); 

当我尝试运行上面的代码时,我仍然得到错误:

MongoError: tailable cursor requested on non capped collection

这看起来不像一个正确的使用封顶集合或可放大的stream。 但也许有一些代码首先展示一个工作的例子:

 var async = require('async'), mongoose = require('mongoose'), Schema = mongoose.Schema; var userSchema = new Schema({ email: String, },{ capped: 2048 }); var User = mongoose.model( "User", userSchema ); mongoose.connect('mongodb://localhost/atest'); var stream; async.waterfall( [ function(callback) { var user = new User({ email: "existing" }); user.save(function(err,doc) { if (err) throw err; callback(); }); }, function(callback) { User.find({}).sort({ "$natural": -1 }).limit(1).exec(function(err,docs) { if (err) throw err; console.log( docs ); callback(err,docs[0]); }); }, function(doc,callback) { stream = User.find({ "_id": { "$gt": doc._id } }).tailable().stream(); stream.on("data",function(doc) { console.log( "Streamed:\n%s", doc ); }); callback(); }, function(callback) { async.eachSeries( ['one','two','three'], function(item,callback) { var user = new User({ email: item }); user.save(function(err,doc) { if (err) throw err; console.log( "Saved:\n%s", doc ); callback(); }); }, function(err) { if (err) throw err; callback(); } ); } ] ); 

首先,真正需要在封顶集合中有所作为。 这假定该集合不存在,并且将被初始化为封顶集合。 那么第一步就是确保有东西在那里。

通常当你想“尾巴”,你只是想要插入的新文件出现。 因此,在设置可拖动的光标之前,您需要在集合中find“最后一个”文档。

当你知道集合中的最后一个文档时,“tailable stream”被设置为查找任何“大于”该文档的新文档。 如果您没有这样做,那么stream中的第一个“数据”事件将清空所有当前的收集项目。 所以这里的.sort().limit()的选项不适用。 拖尾游标初始化和“跟随”。

现在stream媒体接口已经build立,并build立了一个监听器,你可以添加项目到stream中。 这些将会相应地logging下来,但由于这是“平坦的”,因此“logging”没有特定的顺序,因为“保存”或“stream”数据事件实际上可能首先被触发。


现在到你的实现。 这两条线脱颖而出:

  , subscriptions : [ SubscriptionSchema ] , accessTokens : [ AccessToken ] 

那些包含embedded式数组,它们不是另一个集合中的“外部”文档,尽pipe它甚至没有关系。这里的一般问题是(至less在某种程度上)引入了一个数组,这似乎意味着一些“成长”的概念。

除非你的意图是永远不 “增长”这些数组,并且只是将内容与新文档一起插入,而不更新它,那么这将导致封顶集合的问题。

加盖集合中的文档不能超出最初分配的大小。 试图更新发生这种情况将导致错误。 如果您认为自己要做出明智的select并“填充”文档,那么当复制的辅助主机“重新同步”时,这可能会失败。 所有logging的封顶collections。