关于mongoose中查询的tailable游标的错误

时间:2014-07-16 03:36:37

标签: javascript node.js mongodb mongoose stream

用户模型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

1 个答案:

答案 0 :(得分:3)

这看起来不像正确使用上限集合或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();
        }
      );
    }
  ]
);

首先,首先需要在上限集合中添加任何可行的内容。这假设该集合不存在,并且它将被初始化为上限集合。然后第一步是确保存在某些东西。

通常,当您想要" tail"时,您只需要显示插入的新文档。所以在设置tailable游标之前,你想要找到" last"该集合中的文件。

当您知道集合中的最后一个文档时," tailable stream"设置为查找大于"大于"的任何内容。那个文件,这是新文件。如果你没有这样做,你的第一个"数据"流上的事件将清空所有当前集合项。因此,此处.sort().limit()的选项不适用。尾部游标初始化,然后按照"。

现在已设置流式界面并建立了侦听器,您可以向流中添加项目。然后这些将相应地记录,但由于这是" evented",此处的记录没有特定的顺序,因为" save"或者" stream"数据事件实际上可能首先开火。


现在进行实施。这两条线突出:

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

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

除非您打算永远"成长"这些数组只会在新文档中插入内容并且永远不会更新它,这会导致上限集合出现问题。

加盖的集合中的文档不能“成长”#34;超出其初始分配的大小。试图更新这种情况会导致错误。如果你认为你会对它很聪明并且" pad"您的文档,然后当复制的辅助主机"重新同步时,这很可能会失败。所有记录都有加盖的集合。