场景:我想向用户显示一个项目,然后锁定它,以便其他任何人都无法看到它,一旦用户完成它,就显示下一个项目。
问题是发布中的查询必须检查锁定。因此,只要您更改锁定,光标就会更新并且项目会更改。
怎么能解决这个问题?
修改 出版物中的示例代码,不起作用:
var item = Items.find({
locked: false
}, {
limit: 1
});
var itemObj = item.fetch()[0];
Items.update(itemObj._id, {$set: {locked: true}});
return item;
答案 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
; 请注意,每次要选择新项目时,都需要停止订阅并重新运行。如果您使用模板订阅执行此操作,则只需重新加载模板,从而停止订阅然后重新运行(例如,通过单击"下一步"按钮)。
答案 1 :(得分:1)
可能更好的解决方案是将项目分配给userId。完成项目后,该项目将再次取消分配。
可以这样做:
Items.assignToUser
- 查找要分配的项目并设置assignedUserId
完成后:
方法调用Items.unassignFromUser
- 再次将字段assignedUserId
设置为null
。