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

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

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.