流星&锁定出版物

时间:2015-06-30 09:20:36

标签: javascript meteor

场景:我想向用户显示一个项目,然后锁定它,以便其他任何人都无法看到它,一旦用户完成它,就显示下一个项目。

问题是发布中的查询必须检查锁定。因此,只要您更改锁定,光标就会更新并且项目会更改。

怎么能解决这个问题?

修改 出版物中的示例代码,不起作用:

var item = Items.find({
    locked: false
}, {
    limit: 1
});

var itemObj = item.fetch()[0];
Items.update(itemObj._id, {$set: {locked: true}});
return item;

2 个答案:

答案 0 :(得分:1)

一种解决方案是首先查询数据库,更新数据库,然后将光标发送到文档:

Meteor.publish('somePub', function() {
  var itemId = Items.findOne({locked : false})._id;

  Items.update(itemId, {$set: {locked: true}});

  return Items.find(itemId);
});

步骤一步:

  • findOne返回文档,而不是光标。那不需要fetch()[0]。我们只需要_id;
  • 更新与您的相同;
  • 我们send the cursor,针对单个文档,因为我们提供了ID作为参数。

请注意,每次要选择新项目时,都需要停止订阅并重新运行。如果您使用模板订阅执行此操作,则只需重新加载模板,从而停止订​​阅然后重新运行(例如,通过单击"下一步"按钮)。

答案 1 :(得分:1)

可能更好的解决方案是将项目分配给userId。完成项目后,该项目将再次取消分配。

可以这样做:

  • 方法调用Items.assignToUser - 查找要分配的项目并设置assignedUserId
  • 订阅分配给我的所有项目(可能限制为1)

完成后: 方法调用Items.unassignFromUser - 再次将字段assignedUserId设置为null