0

これには、node.jsでマングースを使用しています。

私の現在のスキーマは次のとおりです。

var linkSchema = new Schema({

    text: String,
    tags: array,
    body: String,
    user: String
})

私のユースケースは次のとおりです。ユーザーのリストがあり、各ユーザーにはそれに関連付けられたリンクのリストがあります。もちろん、ユーザーとリンクは異なるスキーマです。したがって、mongo-db を使用して、そのような 1 対 1 の関係をどのように実現するのでしょうか。

ユーザー スキーマを作成し、そこに linkSchema を埋め込む必要がありますか? それとも逆?

それに関するもう一つの疑問。タグは常に、後でリンクを参照するために使用できる文字列の配列です。配列データ型である必要がありますか、それを表すより良い方法はありますか?

4

1 に答える 1

1

1:1 の場合は、一方のドキュメントを他方のドキュメント内にネストします。どちらを回避するかはクエリによって異なりますが、必要に応じて両方を簡単に実行できます。

タグの場合、配列フィールドにインデックスを付けて、それをドキュメントの検索/フィルタリングに使用し、提供した情報から妥当な IMHO に聞こえるようにすることができます。

タグのセットが固定されている場合は、クエリに応じて、おそらく名前付きフィールドを持つネストされたオブジェクトとしてそれらを表すことが理にかなっています。Mongo でネストされたドキュメントを作成できるだけでなく、サブフィールドを検索したり、ネストされたドキュメント全体を検索可能/インデックス可能なフィールドとして使用したりすることもできることを忘れないでください。たとえば、次のようなユーザー名を持つことができます。

email: "joe@somewhere.com"

文字列として、また行うこともできます。

 email: {
     user: "joe",
     domain: "somewhere.com"
 }

どちらの場合もメールのインデックスを作成し、どちらかを照合に使用できます。後者の場合、RegEx スタイルのクエリに頼らずに、ドメインまたはユーザーのみを検索することもできます。両方のバリアントを格納することもできるため、Mongo には多くの柔軟なオプションがあります。

タグに戻ると、あなたが説明したことを考えると、文字列の配列は優れたモデルだと思いますが、より複雑な一括集計を行っている場合、同じドキュメントの内容を持つすべてのタグのドキュメントを保存するのはおかしなことではありません、これは基本的に、集計中にすべてのクエリに対して実行する必要があるためです。

于 2012-10-17T23:40:08.487 に答える