Mereferensikan skema lain di Mongoose

104

jika saya memiliki dua skema seperti:

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}],
});

Saya mencoba menghubungkan mereka bersama seperti contoh di atas tetapi saya tidak tahu bagaimana melakukannya. Akhirnya, jika saya bisa melakukan sesuatu seperti ini, itu akan membuat hidup saya sangat mudah

var profilePic = Post.postedBy.profilePic
Gorkem Yurtseven
sumber

Jawaban:

182

Sepertinya metode mengisi adalah yang Anda cari. Pertama, buat perubahan kecil pada skema posting Anda:

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

Kemudian buat model Anda:

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

Kemudian, saat Anda membuat kueri, Anda dapat mengisi referensi seperti ini:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});
manis
sumber
4
Untuk apa field "ref"? Saya tidak dapat menemukan dokumentasi tentang itu.
K - Toksisitas pada SO meningkat.
3
Bidang @karloron ref artinya koleksi id yang disebutkan akan dicari.
Ankur Verma
Apa perbedaan antara populate dan addToSet?
Winnemucca
1
dimana referensi untuk by:selektro
Muhammad Umer
1
@KarlMorrison Dokumen untuk "ref" dimakamkan di dokumen untuk populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez
19

Tambahan: Tidak ada yang menyebutkan "Populasi" --- sangat berharga waktu dan uang Anda melihat Mongooses Populate Method: Juga menjelaskan referensi dokumen silang

http://mongoosejs.com/docs/populate.html

fino
sumber
1

Terlambat menjawab, tetapi menambahkan bahwa Mongoose juga memiliki konsep Subdocuments

Dengan sintaks ini, Anda seharusnya bisa mereferensikan Anda userSchemasebagai tipe postSchemaseperti Anda :

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}],
});

Perhatikan postedBybidang yang diperbarui dengan tipe userSchema.

Ini akan menyematkan objek pengguna di dalam posting, menyimpan pencarian tambahan yang diperlukan dengan menggunakan referensi. Terkadang ini bisa lebih disukai, di lain waktu rute ref / populate mungkin merupakan cara yang harus ditempuh. Tergantung pada apa yang dilakukan aplikasi Anda.

D. Lowe
sumber