Mongodb meteor-如何更新订阅文档?

Mongodb meteor-如何更新订阅文档?,mongodb,meteor,meteorite,Mongodb,Meteor,Meteorite,我从服务器上订阅了一些收藏。在我尝试从客户端删除一个文档后,它显示删除失败:访问被拒绝。所以我试着用Meteor.call从服务器端删除它,虽然效果很好,但客户端有相同数量的文档 下面的代码将更好地解释您 ClientJS: Template.Message.onCreated(function () { this.autorun(function () { this.subscription = Meteor.subscribe('mymessage'); }.bind(thi

我从服务器上订阅了一些收藏。在我尝试从客户端删除一个文档后,它显示
删除失败:访问被拒绝
。所以我试着用Meteor.call从服务器端删除它,虽然效果很好,但客户端有相同数量的文档

下面的代码将更好地解释您

ClientJS:

Template.Message.onCreated(function () {
  this.autorun(function () {
    this.subscription = Meteor.subscribe('mymessage');
  }.bind(this));
});

Template.Message.onRendered(function () {
  this.autorun(function () {
    if (this.subscription.ready()) {
      console.log(Message.find().count()); //10
     }
  }.bind(this));
});
  Meteor.publish('mymessage', function() {
    console.log(Message.find().count()); //10
    return Message.find();
  }); 
Meteor.call("deletemsg", this._id._str, function(error, result){ 
 if(!error){
     console.log(Message.find().count()); // 10, Want to update document here.
   }
});
ServerJS:

Template.Message.onCreated(function () {
  this.autorun(function () {
    this.subscription = Meteor.subscribe('mymessage');
  }.bind(this));
});

Template.Message.onRendered(function () {
  this.autorun(function () {
    if (this.subscription.ready()) {
      console.log(Message.find().count()); //10
     }
  }.bind(this));
});
  Meteor.publish('mymessage', function() {
    console.log(Message.find().count()); //10
    return Message.find();
  }); 
Meteor.call("deletemsg", this._id._str, function(error, result){ 
 if(!error){
     console.log(Message.find().count()); // 10, Want to update document here.
   }
});
在点击事件中

ClientJS:

Template.Message.onCreated(function () {
  this.autorun(function () {
    this.subscription = Meteor.subscribe('mymessage');
  }.bind(this));
});

Template.Message.onRendered(function () {
  this.autorun(function () {
    if (this.subscription.ready()) {
      console.log(Message.find().count()); //10
     }
  }.bind(this));
});
  Meteor.publish('mymessage', function() {
    console.log(Message.find().count()); //10
    return Message.find();
  }); 
Meteor.call("deletemsg", this._id._str, function(error, result){ 
 if(!error){
     console.log(Message.find().count()); // 10, Want to update document here.
   }
});
Serverjs

  Meteor.methods({
    deletemsg: function (delmsg) {
      if(Message.remove({"_id":new Mongo.ObjectID(delmsg)})){
       console.log(Message.find().count()); //9
       return true;
      } else {
        throw new Meteor.Error("some error message");
      }
     }
  });

注意:我正在使用现有的Mongodb。

您的错误可能与本机规则的配置有关
allow
deny
。您应该在服务器上的某个地方有一段类似这样的代码(
Message
是您的收藏名称):

或使用
拒绝
的等效项。似乎不允许您的当前用户从集合中删除(即删除)邮件

快速侧注:您不需要将订阅包装在
自动运行中。如果您使用iron router,则可以使用内置函数进行订阅。在路线选项中,可以添加如下内容:

action: function() {
    if(this.isReady()) { this.render(); } else { this.render("loading");}
},

isReady: function() {


    var subs = [
        Meteor.subscribe("yourPublication")
    ];
    var ready = true;
    _.each(subs, function(sub) {
        if(!sub.ready())
            ready = false;
    });
    return ready;
},

您不需要使用_str,因为_id已经是字符串

客户端JS

服务器JS

删除文档时,只需传递id,而不需要传递对象

 Meteor.methods({
    deletemsg: function (delmsg) {
      if(Message.remove(delmsg)){
       console.log(Message.find().count()); //9
       return true;
      } else {
        throw new Meteor.Error("some error message");
      }
     }
  });
允许CRUD操作

如果上述方法不起作用,请尝试允许从服务器块对该集合执行CRUD操作。是文档