1

私はマングースを学んでいて、助けが必要です。3 つのコレクションがあり、1 回の API 呼び出しで、相互に参照する 3 つのドキュメントを作成したいと考えています。以下の「結合」:

  • ユーザー - チャープを参照する必要があります
  • ビデオ - チャープを参照する必要があります
  • チャープ - ユーザーとチャープを参照する必要があります

質問: model.create() を実行して、各コールバックで新しいドキュメントを渡し、それぞれのドキュメントを更新できることはわかっていますが、それを行うためのよりクリーンな方法があるかどうか疑問に思っていました。

質問がはっきりしない場合は申し訳ありません。わからないことがあれば聞いてください。

コード

var chirpSchema = new mongoose.Schema({
    date_created: { type: Date, default: Date.now }
  , content: { post : String }
  , _video: { type: $oid, ref: "video" }
  , _author: { type: $oid, ref: "user" }
});
var chirp = mongoose.model('chirp', chirpSchema);


var userSchema = new mongoose.Schema({
    date_joined: { type : Date, default: Date.now }
  , cookie_id: String,
  chirp_library: [{type: $oid, ref: "chirp"}]
})
var user = mongoose.model('user', userSchema);


var videoSchema = new mongoose.Schema({
    date_tagged: { type : Date, default: Date.now }
  , thumbnail_url : String
  , _chirps: [{type: $oid, ref: "chirp" }]
});
var video = mongoose.model('video', videoSchema);
4

1 に答える 1

1

Mongo やその他の NoSQL データベースは、単に SQL データベースの交換可能な代替手段ではありません。設計を別の方法で再考する必要があります。概念は、関係を定義することではありません。アイデアは、より少ないクエリで情報を利用できるようにすることです。配列は、特に無限に大きくなる可能性がある場合は特に、Mongo では避けるべきものです。あなたのネーミングからすると、その可能性が高いように思えます。残りのスキーマを保持し、これら 2 つの配列をユーザー スキーマとビデオ スキーマから削除するだけの場合:

chirp.find({_author: yourUserId}).populate("_author")user.findOne({_id: yourUserId})現在の設計と同じ情報が得られます。

同様に、

chirp.find({_video: yourVideoId}).populate("_video")video.findOne({_id: yourVideoId})

これに関する唯一の問題は、.populate()引っ張っているすべてのチャープで が実行されていることです。これを回避する方法は、チャープ ドキュメントの作成者ドキュメントとビデオ ドキュメントの一部 (またはすべて) を非正規化することです。これをどのように設計するかは次のとおりです。

var chirpSchema = new mongoose.Schema({
    date_created: { type: Date, default: Date.now },
    content: { 
        post : String 
    },
    _author: { 
        _id: { type: $oid, ref: "video" },
        date_joined: { type: Date, default: Date.now }
    },
    _video: { 
        _id: { type: $oid, ref: "user" },
        date_tagged: { type: Date, default: Date.now },
        thumbnail_url: String
    }
});

var userSchema = new mongoose.Schema({
    date_joined: { type : Date, default: Date.now }
  , cookie_id: String
})

var videoSchema = new mongoose.Schema({
    date_tagged: { type : Date, default: Date.now }
  , thumbnail_url : String
});

クエリがより効率的になる限り、データを繰り返しても問題ありません。そうは言っても、読むことと書くことのバランスを取る必要があります。ユーザー情報またはビデオ情報が定期的に変更される場合は、各チャープ ドキュメントでそのデータを更新する必要があります。ビデオ/作成者に定期的に変更される特定のフィールドがある場合、クエリで必要ない場合は、チャープ ドキュメントからそのフィールドをそのままにしておくことができます。

于 2015-02-20T04:24:44.337 に答える