2

我的集合中有一些带有标签的对象:

var Obj = new Meteor.Collection('objects');
Obj.insert({ name: 'object1', tags: [] });

我想在服务器上维护所有使用的唯一标签的集合,跨越集合中的对象。我通过另一个标签系列集合来做到这一点(因为我想为Obj其他集合维护多个单独的标签列表):

var TagFamilies = new Meteor.Collection('tagfamilies');
TagFamilies.insert({ name: 'obj', taglist: ['tag1', 'tag2'] });

(假设 'tag1' 和 'tag2' 已经添加到标签系列中,例如)

通常,我会像这样更新对象的标签:

Obj.update({ name: `object1` }, { $set: { tags: ['tag1', 'tag3'] } });

在那之后,我希望taglist持有['tag1', 'tag2', 'tag3']

taglist添加新标签而不重复的最有效方法是什么?

我可以想到以下(但欢迎使用不同的选项):

  1. 创建一个特定的Meteor.methods,但是我的客户端代码需要区分是否要添加标签与更新其他常规属性ObjthroughMeteor.Collection.update
  2. 连接函数中的特定代码Meteor.Collection.allow,但它会在每次更新Obj(性能命中)时运行,并且allow看起来并不真的是此类代码的正确位置
4

2 回答 2

2

我终于在另一个论坛上找到了答案,在这里发布以供记录。在服务器上,执行以下操作:

TagFamilies.update({ name: 'obj' },
       {$addToSet: {taglist: {$each: ['tag1', 'tag3ect1']}}});
于 2013-05-16T21:07:02.113 回答
1

你可以这样做:

var ObjId = Obj.findOne({name:object});

Obj.update({ _id: ObjId._id }, { $push: { tags: 'tag3' } });

而不是使用$set考虑使用$push来添加新的。或者使用 set 并创建一个合并数组。(您确实需要检查 tag1 是否已经存在)。您可以使用下划线(添加meteor add underscore)来告诉您不存在的内容

客户端js

newTags = ['tag1', 'tag2', 'tag3']
var Tags = ObjId.tags.concat(newTags)  //Merge the two arrays
Tags = _.uniq(Tags); //Get rid of duplicates
Obj.update({ _id: ObjId._id }, { $set: { tags: Tags } });

(从客户端流星需要运行任何东西updateremove有一个 ID 来确定它要修改的内容,因此您需要先使用它findOne来获取它。

关于安全性,最好制定Meteor.allow规则,因为它为用户提供了最好的体验。使用 meteor.call/method 不包含延迟补偿,因此在等待回调时它会有点慢。(您只检查它是否是一个数组并且数据不是恶意的)但是您可以在客户端上插入标签

于 2013-05-01T08:12:48.203 回答