如何仅在一个客户端上打开 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 的解决方案比这个更简单,而且工作正常。
如果您需要立即知道谁赢了,而无需向服务器发出进一步请求,则此解决方案很有用。
我有一颗流星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 的解决方案比这个更简单,而且工作正常。
如果您需要立即知道谁赢了,而无需向服务器发出进一步请求,则此解决方案很有用。