0

次のような投稿用とラベル用の 2 つのコレクションがあります。

Post {
   "_id": "WZTEGgknysdfXcQBi",
   "title": "ASD",
   "labels": {},
   "author": "TMviRL8otm3ZsddSt",
   "createdAt": "2016-01-14T08:42:42.343Z",
   "date": "2016-01-14T08:42:42.343Z"
}

Label {
   "_id": "9NCNPGH8F5MWNzjkA",
   "color": "#333",
   "name": "Grey Label",
   "author": "TMviRL8otm3ZsddSt"
}

私が達成したいのは、投稿に複数のラベルを付けることです。

問題は、投稿にラベル データを挿入できないことです。新しい投稿を追加するためのテンプレートがあり、そこでラベルを繰り返しています。次に、ヘルパーで、チェックされているラベルを確認して配列に保存しますが、その配列を Posts コレクションに挿入できません。

'submit .add-entry': function(event) {
    var title = event.target.title.value;
    var description = event.target.description.value;

    var checkedLabels = $('.label-checkbox:checked');

    //initiate empty array
    var labelsArray = [];

    //go over the checked labels
    for(i = 0; i < checkedLabels.length; i++){
        var label = checkedLabels[i].value;

        // store ids into array
        labelsArray.push(label)
    };

    Posts.insert({
        title: title,
        description: description,
        labels: labelsArray
    });

Q1:すべてのタグ データを挿入する必要がありますか、それとも ID だけがその ID に基づいてタグ コレクションから詳細を取得する必要がありますか?

Q2:ラベルの配列を投稿に挿入するにはどうすればよいですか? オブジェクトが必要なため、上記のコードは機能しません

Q3コレクション間のこのような関係を実現する最善の方法は何ですか?

4

2 に答える 2

1

(Q1) そのリストにすべてのタグ ID を挿入して、labelsそれを更新し続けることができます (Q3) それは良い習慣だと思います。開発プロセスで、このパッケージで複合コレクションを使用して公開してみてください: https://github.com/englue/meteor-publish-composite

(Q2) 挿入は簡単です。

Post.insert({title:'Abc', labels:['one', 'two']});

$addToSetを使用して更新する必要があります。可能な方法の例を次に示します。

let setModifier = {
  $addToSet: {
    labels: myArrayOfLabelIDs
  }
};
return Post.update({
  _id: id
}, setModifier);

:クライアントで挿入を使用しないでください(あなたがしたように)。私の例は、サーバー上のメソッドとして追加でき (check()その中で使用)、次のように送信時にクライアントから呼び出すことができます。

Meteor.call('myMethod', id, labelsArray)
于 2016-01-14T10:37:00.420 に答える
1

Q1: すべてのタグ データを挿入する必要がありますか、それとも ID だけがその ID に基づいてタグ コレクションから詳細を取得する必要がありますか?

それは異なります:ラベルは変わりますか?変更可能な場合は、ID でラベルを取得すると常に適切なデータが返されるように、ID のみを保存するのが最適です。それ以外の場合は、すべての投稿を新しいラベル情報で更新する必要があります。

Q2: ラベルの配列を投稿に挿入するにはどうすればよいですか? オブジェクトが必要なため、上記のコードは機能しません

コードが機能しない場合は、一致しないスキーマを使用している可能性があります。オブジェクトの代わりに配列を挿入するには、配列を受け入れるようにスキーマを変更する必要があります。スキーマの詳細を投稿していません。

Q3 コレクション間のこのような関係を実現する最善の方法は何ですか?

「非正規化」を見る必要があります。これは、MongoDB のような NoSQL データベースでこの種のものに使用される用語です。直接的な答えはありません。関係 (1-1、1-多、多-1) とそれぞれの「多」の比率によって異なります。場合によっては、オブジェクトが不変である場合や、更新を処理することはそれほど苦痛ではありません。

この一連のブログ投稿は、理解を深めるのに役立ちます: http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1

于 2016-01-14T18:34:18.160 に答える