0

マングースとNodeJSを使用して、「車」と「ホイール」のスキーマがあるとします。車は車輪の配列を格納します。

var Wheel = new Schema({
    color : { type: String },
    timestamp : { type: Date }
});

var Car = new Schema({
    wheels : [Wheel],
    timestamp : { type: Date }
});

車のドキュメントにこれらのホイールの静的コピーが含まれるか、またはリンクとして保存されるホイールですか(車が作成されてからホイールが変更された場合でも、ルックアップ時にホイールの最新の状態が反映されます)。

4

3 に答える 3

1

ここでのスキーマ設計の幅広い選択肢は、埋め込みとリンクです。これらは両方とも使用規則によって実装されており、サーバー実装の意味での「機能」ではありません(つまり、MongoDB 2.0サーバーは参照またはリレーショナルルックアップ機能を実装していません)。

条件を明確にするために:

  • 埋め込みとは、BSONドキュメント内にオブジェクトと配列をネストすることです。

  • リンク(別名データベース参照またはDBRef)は、ドキュメント間の参照です。

元の例のようにを埋め込むと、サブドキュメント(または説明したように「静的コピー」)が作成されます。他の場所に保存されている情報とは関係ありません。

リンクすると、別のコレクションのドキュメントの主キーである参照が追加されます。この参照をドキュメントにハイドレイトする場合は、追加のデータベースクエリが必要です。使用するクライアントドライバーによっては、これを自動的に行うヘルパーが存在する場合があります。同じルックアップを手動で行うこともできます。

于 2012-07-18T03:10:49.970 に答える
0

私は別の方法でそれをやっています:

var Car = new Schema({
    wheels : [Schema.ObjectId],
    timestamp : { type: Date }
});

次に、4つのホイールと1つの車があるとします。

car.wheels.push(wheel1._id);
car.wheels.push(wheel2._id);
car.wheels.push(wheel3._id);
car.wheels.push(wheel4._id);

_idプロパティを設定するには、Wheelsを事前に保存する必要があると思います。

次に、MongoDBでは、プロパティCar.wheelsはObjectIDの配列(つまり、wheelsへの参照)であり、Javascriptでそれを行うことができます。

car.wheels[0].color

スキーマでも同じように機能すると思います。

于 2012-07-17T12:43:07.813 に答える
0

あなたの場合、それは車の静的ホイールだと思います。参照を使用するには、dbrefを次のように使用します。

var Car = new Schema({
wheels : [ { type : Schema.ObjectId, ref : 'Wheel' } ],
timestamp : { type: Date } });

于 2012-07-17T13:54:50.320 に答える