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が、タグを追加するか、他の通常の属性を更新するかをクライアント コードで区別する必要がありObjます。Meteor.Collection.update
  2. 関数内の特定のコードをフックしますが、 (パフォーマンス ヒット)Meteor.Collection.allowへの更新ごとに実行され、そのようなコードの適切な場所とは思えません。Objallow
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 } });

(クライアントから meteor を実行するには、何かを実行する必要がありupdate、何removeを変更するかを決定するための ID を持っている必要があるfindOneため、最初にそれを取得するために使用する必要があります。

セキュリティに関してはMeteor.allow、ユーザーに最高のエクスペリエンスを提供するため、ルールを作成するのが最善です。meteor.call/method を使用するとレイテンシー補正が組み込まれないため、コールバックを待っている間は少し遅くなります。(配列であり、データに悪意がないかどうかを確認するだけです) ただし、クライアントにタグを挿入することはできます

于 2013-05-01T08:12:48.203 に答える