首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何仅在一个客户端上打开集合项?

如何仅在一个客户端上打开集合项?
EN

Stack Overflow用户
提问于 2015-01-13 14:05:07
回答 1查看 58关注 0票数 2

我有一个像这样的流星收藏:

代码语言:javascript
运行
复制
Cases = new Meteor.Collection('cases');

我也有注册用户(最多10)。现在,我希望能够“给”一个注册用户一个案例,并确保没有其他用户得到该特定情况。

用户正在处理这个案例(更新字段、删除字段),然后在提交之后将其发送到某种存档中,用户应该得到集合中的一个新案例。

我的想法是让名为"locked“的字段最初设置为false,在用户显示"locked”的那一刻变为真,不再返回:

代码语言:javascript
运行
复制
return Cases.find({locked: false, done: false}, {limit: 1});

有什么办法在流星上做到吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-01-13 14:24:28

还有一些并发问题要处理,以便将案件可靠地分配给一个人。

我们需要解决两件事: 1.可靠地将案例分配给用户2.获取分配给用户的案例

数字2很容易,但取决于1。

要解决1.,这应该是可行的:

代码语言:javascript
运行
复制
var updated = Cases.update(
    {_id: <case-to-assign>, version: "ab92c91"},
    {assignedTo: Meteor.userId(), version: Meteor.Collection.ObjectID()._str});
if (updated) {
    // Successfully assigned
} else {
    // Failed to assign, probably because the record was changed first
}

使用它,您可以查询所有用户的情况:

代码语言:javascript
运行
复制
var cases = Cases.find({assignedTo: Meteor.userId()});

如果10人同时尝试得到一个案例,它应该有一个预先设置的version字段,而MongoDB只允许.update工作一次。一旦version字段更改(由于.update成功),剩余的更新将失败,因为version字段无法再匹配。

现在已经可靠地进行了分配,抓取非常简单。

正如@Kyll所建议的那样,对案例的过滤应该在Meteor出版物中进行。

在Meteor方法中执行案例分配也是有意义的。

更新:

@richsilv的解决方案比这个更简单,而且效果很好。

如果您需要立即知道谁赢了,而不向服务器提出进一步的请求,则此解决方案非常有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27923968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档