Mongooseで別のスキーマを参照する


104

次のような2つのスキーマがある場合:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var  User = mongoose.model('User') 

var postSchema = new Schema({
    name: String,
    postedBy: User,  //User Model Type
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

上記の例のように接続しようとしましたが、どうすればいいのかわかりませんでした。結局、私がこのようなことができるなら、それは私の人生をとても簡単にします

var profilePic = Post.postedBy.profilePic

回答:


182

Populateメソッドがあなたの探しているもののようです。まず、投稿スキーマに小さな変更を加えます。

var postSchema = new Schema({
    name: String,
    postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

次に、モデルを作成します。

var Post = mongoose.model('Post', postSchema);

次に、クエリを作成するときに、次のように参照を設定できます。

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});

4
「ref」フィールドとは何ですか?ドキュメントが見つかりません。
K-SOの毒性が高まっています。

3
@KarlMorrison refフィールドは、言及されたIDが検索されるコレクションを意味します。
Ankur Verma

PopulateとaddToSetの違いは何ですか?
Winnemucca 2017

1
by:selectroの参照はどこですか
Muhammad Umer 2017

1
「REF」のドキュメント@KarlMorrisonのためのドキュメントに埋め込まれているpopulatemongoosejs.com/docs/populate.html
ジェフリー・マルティネス


1

遅い回答ですが、Mongooseにはサブドキュメントの概念もあります。

この構文を使用すると、次のようにuserSchemaして型としてを参照できるはずですpostSchema

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var postSchema = new Schema({
    name: String,
    postedBy: userSchema,
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

postedByタイプが更新されたフィールドに注意してくださいuserSchema

これにより、投稿内にユーザーオブジェクトが埋め込まれ、参照を使用して必要な追加のルックアップが保存されます。これが望ましい場合もあれば、ref / populateルートが適切な場合もあります。アプリケーションの動作によって異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.