如何仅在一个客户端上打开 collection 个项目?

How to open a collection item only on one client?

我有一颗流星collection是这样的:

Cases = new Meteor.Collection('cases');

我也有注册用户(最多 10 个)。我现在希望能够 "give" 向注册用户发送单个案例,并确保没有其他用户收到该特定案例。

用户正在处理案例(更新字段、删除字段),然后在提交后将其发送到某种存档中,用户应该会在 collection.[=13 中得到一个新案例=]

我的想法是有一个名为 "locked" 的字段,它最初设置为 false,在它显示在用户面前的那一刻 "locked" 变为 true 并且不再返回:

return Cases.find({locked: false, done: false}, {limit: 1});

知道如何在 meteor 中做到这一点吗?

谢谢

您只需在案例中附加一个 owner 字段(或类似字段)。这将允许您执行以下操作:

  • 只有 publish 用户也是所有者的情况,使用类似的东西:

Meteor.publish('cases/unassigned', function() {
    return Cases.find({owner: {$exists: false}});
});
Meteor.publish('cases/mine', function() {
    return Cases.find({owner: this.userId});
});
  • 不是 allow 用户更新或删除未分配给他们的个案:

Cases.allow({
    update: function(userId, fieldNames, doc, modifier) {
        return userId === doc.owner;
    },
    delete: function(userId, doc) {
        return userId === doc.owner;
    }
});

显然,这些需要针对超级用户等内容进行修改,您可能需要定义一些 methods 以允许用户处理案例,但这是一般的想法。

有并发问题需要处理,可靠地将一个案例分配给一个人。

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

数字 2. 很简单,但取决于 1.

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

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
}

使用它您可以查询所有用户案例:

var cases = Cases.find({assignedTo: Meteor.userId()});

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

既然分配已经可靠地进行了,那么获取就非常简单了。

正如@Kyll 所建议的,案例过滤应该在 Meteor 发布中完成。

在 Meteor 方法中执行大小写分配也很有意义。

更新:

@richsilv 的解决方案比这个更简单,而且工作正常。

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