关于在mongoose中查询的可跟踪游标的错误
an error about tailable cursor for a query in mongoose
用户模型包含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
这看起来不像是对已封顶集合或可尾流的正确使用。但也许先用一小段代码来演示一个工作示例:
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();
}
);
}
]
);
首先,在capped集合中确实需要一些东西才能工作。这假定该集合不存在,并且它将被初始化为一个上限集合。那么第一步就是确保有东西在那里。
通常,当您想要"tail"时,您只希望显示插入的新文档。因此,在设置可跟踪游标之前,您需要找到集合中的"最后"文档。
当您知道集合中的最后一个文档时,将设置"可跟踪流"以查找"大于"该文档的任何内容,即新文档。如果不这样做,流上的第一个"data"事件将清空所有当前集合项。所以这里的.sort()
和.limit()
选项不适用。尾游标初始化并"跟随"。
既然设置了流接口并建立了侦听器,就可以向流中添加项了。然后这些将相应地记录日志,但由于这是"事件化的",因此这里的日志记录没有特定的顺序,因为"保存"或"流"数据事件实际上可能首先触发。
现在开始您的实现。这两行很突出:
, subscriptions : [ SubscriptionSchema ]
, accessTokens : [ AccessToken ]
这些包含嵌入数组,它们不是另一个集合中的"外部"文档,即使它甚至没有关系。这里的一般问题是,您(至少以某种方式)引入了一个数组,这似乎暗示了某种"增长"的概念。
除非您的意图是永远不"增长"这些数组,并且只使用新文档插入内容而不更新它,否则这将导致上限集合的问题。
封顶集合中的文档不能"增长"到超出其初始分配的大小。尝试在发生这种情况的地方进行更新将导致错误。如果您认为自己很聪明,可以"填充"文档,那么当复制的辅助主机"重新同步"时,这可能会失败。
- 动态分配GA增强型电子商务跟踪器
- 跟踪在页面加载时应用内联样式的JavaScript
- 跟踪用户点击Adsense广告的IP地址
- 跟踪jqplot垂直折线图的鼠标位置
- 点击facebook像素跟踪注册(JS/JQUERY代码)
- CSS中的游标属性似乎不适用于USB On The Go
- 如何合并不同集合的游标并按日期排序
- 有没有一种方法可以从URL跟踪请求的域
- Javascript-在视频中跟踪鼠标位置
- 在Google Analytics中跟踪用户,但只能在两个操作之间跟踪
- 如何使用Google Analytics跟踪表单提交
- Fresh Spark Install+Homestead上的Vue异步堆栈跟踪错误
- 代码挑战:创建一个跟踪对象实例总数的类Foo
- 打印javascript控制台的堆栈跟踪
- 谷歌分析:如何跟踪移动网站的点击量作为对主网站的点击
- 即使光标位于屏幕边缘,也可以跟踪鼠标速度
- 什么'这是谷歌分析跟踪代码使用的技术
- 检查对象是否是mongo游标
- 如何将Google Analytics配置为将URL参数作为单个页面进行跟踪
- 关于在mongoose中查询的可跟踪游标的错误