簡體   English   中英

關於mongoose中查詢的tailable游標的錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM