Javascript mongoose中查询的可裁剪光标错误
用户模型contian SubscriptionSchema和AccessToken模式,我也用Javascript mongoose中查询的可裁剪光标错误,javascript,node.js,mongodb,mongoose,stream,Javascript,Node.js,Mongodb,Mongoose,Stream,用户模型contian SubscriptionSchema和AccessToken模式,我也用{capped:234556}定义了这两个插件模式 var User = new Schema({ email : String , firstName : String , password : String , isAdmin : Boolean
{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:在非封顶集合上请求的可裁剪光标
看起来不像是封顶集合或可裁剪流的正确用法。但也许先用一段代码来演示一个工作示例:
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集合。然后第一步是确保有东西在那里
通常,当您想要“跟踪”时,您只需要显示插入的新文档。因此,在设置可裁剪光标之前,您希望找到集合中的“最后”文档
当您知道集合中的最后一个文档时,“可裁剪流”被设置为查找“大于”该文档的任何内容,即新文档。如果不这样做,流上的第一个“数据”事件将清空所有当前集合项。因此,此处的.sort()
和.limit()
选项不适用。尾随光标初始化并“跟随”
现在已经设置了流接口并建立了侦听器,您可以向流中添加项目。然后,这些将相应地进行日志记录,但由于这是“事件”,因此这里没有特定的日志记录顺序,因为“保存”或“流”数据事件实际上可能首先触发
现在来看看您的实现。这两条线很突出:
, subscriptions : [ SubscriptionSchema ]
, accessTokens : [ AccessToken ]
那些包含嵌入数组的文档,它们不是另一个集合中的“外部”文档,即使它是这样也无关紧要。这里的一般问题是,您(至少在某种程度上)引入了数组,这似乎暗示了某种“增长”的概念
除非您的目的是永远不增加这些数组,并且只插入新文档中的内容,并且永远不更新它,否则这将导致封顶集合出现问题
封顶集合中的文档不能“增长”超过其初始分配的大小。尝试更新发生这种情况的位置将导致错误。如果您认为您将对此非常明智,并“填充”您的文档,那么当复制的辅助主机“重新同步”时,这很可能会失败。所有文档都包含封顶集合。这看起来不像是封顶集合或可裁剪流的正确用法。但也许先用一段代码来演示一个工作示例:
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集合。然后第一步是确保有东西在那里
通常,当您想要“跟踪”时,您只需要显示插入的新文档。因此,在设置可裁剪光标之前,您希望找到集合中的“最后”文档
当您知道集合中的最后一个文档时,“可裁剪流”被设置为查找“大于”该文档的任何内容,即新文档。如果不这样做,流上的第一个“数据”事件将清空所有当前集合项。因此,此处的.sort()
和.limit()
选项不适用。尾随光标初始化并“跟随”
现在已经设置了流接口并建立了侦听器,您可以向流中添加项目。然后,这些将相应地进行日志记录,但由于这是“事件”,因此这里没有特定的日志记录顺序,因为“保存”或“流”数据事件实际上可能首先触发
现在来看看您的实现。这两条线很突出:
, subscriptions : [ SubscriptionSchema ]
, accessTokens : [ AccessToken ]
那些包含嵌入数组的文档,它们不是另一个集合中的“外部”文档,即使它是这样也无关紧要。这里的一般问题是,您(至少在某种程度上)引入了数组,这似乎暗示了某种“增长”的概念
除非您的目的是永远不增加这些数组,并且只插入新文档中的内容,并且永远不更新它,否则这将导致封顶集合出现问题
封顶集合中的文档不能“增长”超过其初始分配的大小。尝试更新发生这种情况的位置将导致错误。如果您认为您将对此非常明智,并“填充”您的文档,那么当复制的辅助主机“重新同步”时,这很可能会失败。所有文档都包含封顶集合。首先,非常感谢您,代码很好。您对如何在猫鼬中使用
capped
和tail
有很好的解释。这对我帮助很大。首先,非常感谢您,代码很好。您对如何在猫鼬中使用capped
和tail
有很好的解释。这对我帮助很大。