[英]an error about tailable cursor for a query in 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
這看起來不像正確使用上限集合或tailable流。 但也許首先要用一些代碼來展示一個有效的例子:
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();
}
);
}
]
);
首先,在封頂的集合中確實需要有一些東西才能發揮作用。 這假設該集合不存在,並且它將被初始化為上限集合。 然后第一步是確保有東西存在。
通常,當您想要“尾”時,您只需要插入的新文檔出現。 因此,在設置tailable游標之前,您需要在集合中找到“last”文檔。
當您知道集合中的最后一個文檔時,“tailable stream”被設置為查找“大於”該文檔的任何內容,即新文檔。 如果您不這樣做,流上的第一個“數據”事件將清空所有當前集合項。 因此, .sort()
和.limit()
的選項不適用。 尾部游標初始化並“跟隨”。
現在已經設置了流接口並建立了偵聽器,您可以將項添加到流中。 然后這些將相應地記錄,但由於這是“事件”,因此這里的記錄沒有特定的順序,因為“保存”或“流”數據事件實際上可能首先觸發。
現在進入您的實施。 這兩條線突出:
, subscriptions : [ SubscriptionSchema ]
, accessTokens : [ AccessToken ]
那些包含嵌入式數組,它們不是另一個集合中的“外部”文檔,即使它甚至沒有關系。這里的一般問題是你(至少在某種程度上)引入一個數組,這似乎意味着一些“增長”的概念。
除非您的意圖是永遠 “增長”這些數組並且只使用新文檔插入內容並且永遠不更新它,否則這將導致上限集合出現問題。
封頂集合中的文檔無法“增長”超出其初始分配的大小。 試圖更新這種情況會導致錯誤。 如果您認為自己要聰明並“填充”文檔,那么當復制的輔助主機“重新同步”時,這可能會失敗。 所有記錄都有上限集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.