2017-08-24 5 views
0

私は1対多のモデルをいくつか使用しており、子のObjectID()と親のモデルのObjectID()の配列を持つことの利点が何であるか疑問に思っていました。たとえば:mongoose-schema - どちらも子配列+親ドキュメントのIDが必要ですか?

// a client will have a new card every ten visits 
var ClientSchema = new Schema({ 
    first_name: String, 
    last_name: String, 
    email: String, 
    cards: [] // ObjectID()s, <--- is this necessary? 
}); 

var CardSchema = new Schema({ 
    client: ObjectID(), // <--- or is this enough? 
    visits: [] 
}); 

私はclient: ObjectID()が特別人口オプションのマングースの提供と、ほとんどの場合、トリックを行うべきだと思います。

答えて

1

参照ObjectIdをドキュメントの1つに格納すれば十分です。

ドキュメントまたはthis answerに記載されているとおり、参照フィールドにはtyperefが必要です。フィールドの名前は任意です。これを実行してモデルを登録したら、モデルを使用してクエリを作成できます。

var clientSchema = new Schema({ 
    first_name: String, 
    last_name: String, 
    email: String 
}); 

var cardSchema = new Schema({ 
    client: { 
     type: Schema.Types.ObjectId, 
     ref: 'client' 
    } 
}); 

// models 
var Card = mongoose.model('Card', cardSchema); 
var Client = mongoose.model('Client', clientSchema); 

しかし、ObjectIdの配列を格納すると便利です。しかし、これはまた、間違いのための巨大なウィンドウを作成します。 SQLの方言での外部キーと主キーの不一致。カウントする必要がある場合は、常にカウントクエリを実行できます。私は言っている、上記のいずれかを行うか、これを行う:

var clientSchema = new Schema({ 
    first_name: String, 
    last_name: String, 
    email: String, 
    cards: [ 
     { 
      type: Schema.Types.ObjectId, 
      ref: 'card' 
     } 
    ] 
}); 

var cardSchema = new Schema({ 
    card_name: String 
}); 

// models 
var Card = mongoose.model('Card', cardSchema); 
var Client = mongoose.model('Client', clientSchema); 
+1

素晴らしい!ありがとう@PimHeijden!私が遭遇したすべての例は両方を使用しています。たぶん、1つのクエリだけを作成し、 'cards'配列の長さにアクセスすることができますか? – brunouno

+1

ありがとう!私は今コメントすることができます。これは私の最初のコメントですXO –

+1

はい。ところで私はanserを更新しました –

関連する問題