gpt4 book ai didi

javascript - 关于 mongoose 查询的 tailable cursor 的错误

转载 作者:行者123 更新时间:2023-11-30 12:40:11 24 4
gpt4 key购买 nike

用户模型包含 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:非上限集合上请求的可尾游标

最佳答案

这看起来不像是 capped collection 或 tailable 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();
}
);
}
]
);

首先,capped 集合中确实需要有一些东西才能正常工作。这假定该集合不存在,并且它将被初始化为一个上限集合。然后第一步是确保那里有东西。

一般当你想“拖尾”的时候,你只是想让插入的新文档出现。因此,在设置可尾游标之前,您需要找到集合中的“最后一个”文档。

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

既然设置了流接口(interface)并建立了监听器,您就可以将项目添加到流中了。然后这些将相应地记录,但由于这是“事件”,因此此处的记录没有特定的顺序,因为“保存”或“流”数据事件实际上可能首先触发。


现在开始实现。这两行很突出:

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

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

除非您的意图是从不“增长”这些数组并且只在新文档中插入内容并且从不更新它,否则这将导致上限集合出现问题。

上限集合中的文档不能“增长”到超出其初始分配的大小。尝试更新发生这种情况的位置将导致错误。如果您认为您会对此很聪明并“填充”您的文档,那么当复制的辅助主机“重新同步”时,这很可能会失败。所有记录都带有上限集合。

关于javascript - 关于 mongoose 查询的 tailable cursor 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24771780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com