Riferimento a un altro schema in Mongoose


104

se ho due schemi come:

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

Ho provato a collegarli insieme come nell'esempio sopra ma non sono riuscito a capire come farlo. Alla fine, se riesco a fare qualcosa del genere, mi renderebbe la vita molto facile

var profilePic = Post.postedBy.profilePic

Risposte:


182

Sembra che il metodo di compilazione sia quello che stai cercando. Innanzitutto apporta piccole modifiche allo schema del tuo post:

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

Quindi crea il tuo modello:

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

Quindi, quando esegui la query, puoi popolare i riferimenti in questo modo:

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

4
A cosa serve il campo "ref"? Non riesco a trovare la documentazione su di esso.
K - La tossicità in SO sta crescendo.

3
Il campo ref @KarlMorrison indica in quale raccolta verrà cercato l'ID menzionato.
Ankur Verma

quale sarebbe la differenza tra populate e addToSet?
Winnemucca

1
dove è il riferimento per by:selectro
Muhammad Umer

1
@KarlMorrison I documenti per "ref" sono sepolti nei documenti per populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez


1

Risposta tardiva, ma aggiungendo che Mongoose ha anche il concetto di documenti secondari

Con questa sintassi, dovresti essere in grado di fare riferimento al tuo userSchemacome tipo nel tuo postSchemasimile così:

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

Annotare il postedBycampo aggiornato con il tipo userSchema.

Ciò incorporerà l'oggetto utente all'interno del post, salvando una ricerca aggiuntiva richiesta utilizzando un riferimento. A volte questo potrebbe essere preferibile, altre volte il percorso ref / populate potrebbe essere la strada da percorrere. Dipende da cosa sta facendo la tua applicazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.