MongoError:尾标中没有更多文档

MongoError: No More Documents in Tailed Cursor

本文关键字:文档 MongoError      更新时间:2023-09-26

我有一个带上限的集合,我正试图使用mongoose跟踪它。当所有文档都用完或根本没有文档时,可裁剪流会出错。

猫鼬模式

var photoSchema = new Schema({
    name: String,
    operations: Schema.Types.Mixed,
}, {
    capped: {
        size: 300 * 500,
        max: 500,
        autoIndexId: true
    }
});

实现

var RawPhoto = mongoose.model('RawPhoto', photoSchema);
var ProcessedPhoto = mongoose.model('ProcessedPhoto', photoSchema)
var ProcessedPhoto = mongoose.model('ProcessedPhoto', photoSchema)
var processedPhotoStream = ProcessedPhoto.find().tailable(true, 
    {awaitdata: true, numberOfRetries: Number.MAX_VALUE}).stream();
processedPhotoStream.on('data', function(photo){
    console.log(photo.name);
}).on('error', function(error){
    console.error(error);
}).on('close', function(){
    console.log("processed photo stream closed")
});

在控制台中,我得到一个MongoError: No more documents in tailed cursor和我自己的消息processed photo stream closed。我看到人们在过去因为猫鼬和最新版本的MongoDB之间的不兼容而遇到了麻烦,但我仍然有这个问题。

您的光标标志不正确,因此被忽略。你真的只想要带"大写'D'"的awaitData

var processedPhotoStream = ProcessedPhoto.find().tailable(true, 
    { awaitData: true }).stream();

addCursorFlag 的本机驱动程序文档中列出了有效选项

要设置的标志必须是以下之一["可用"、"oplogReplay"、"noCursorTimeout"、"awaitData"、"partial"]。


简单的列表,没有问题

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/capped');
mongoose.set('debug',true);
var photoSchema = new Schema({
  "name": String
}, {
  "capped" : {
    "size": 500 * 1024,
    "max": 500
  }
});
var Photo = mongoose.model('Photo',photoSchema);
var stream = Photo.find().tailable(true,
  { awaitData: true }).stream();
stream.on('data',function(data) {
  console.log(data);
});
stream.on('err',function(err) {
  console.error(err);
});
stream.on('close',function() {
  console.log('done');
});
setInterval(function() {
  Photo.create({ "name": "Ted" },function(err,photo) {
  });
},2000);

持续输出:

Mongoose: photos.find({}) { awaitData: true, tailable: true, fields: undefined }
Mongoose: photos.insert({ name: 'Ted', _id: ObjectId("5715af20daa62598059adaf1"), __v: 0 })
{ __v: 0, name: 'Ted', _id: 5715af20daa62598059adaf1 }
Mongoose: photos.insert({ name: 'Ted', _id: ObjectId("5715af23daa62598059adaf2"), __v: 0 })
{ __v: 0, name: 'Ted', _id: 5715af23daa62598059adaf2 }
Mongoose: photos.insert({ name: 'Ted', _id: ObjectId("5715af25daa62598059adaf3"), __v: 0 })
{ __v: 0, name: 'Ted', _id: 5715af25daa62598059adaf3 }

当我在一个不存在的集合上创建一个可裁剪的游标时,我遇到了这个错误。在我的例子中,我创建了一个集合"caped",但mongoose在模型名称的末尾添加了"s"。由于集合变为复数,尾部光标正在查找集合名称"cappeds"