Référencer un autre schéma dans Mongoose


104

si j'ai deux schémas comme:

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

J'ai essayé de les relier comme dans l'exemple ci-dessus mais je ne savais pas comment le faire. Finalement, si je peux faire quelque chose comme ça, ça me rendrait la vie très facile

var profilePic = Post.postedBy.profilePic

Réponses:


182

Il semble que la méthode populate soit ce que vous recherchez. Commencez par apporter de petites modifications à votre schéma de publication:

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

Faites ensuite votre modèle:

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

Ensuite, lorsque vous effectuez votre requête, vous pouvez remplir des références comme ceci:

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

4
A quoi sert le champ "ref"? Je ne trouve pas de documentation là-dessus.
K - La toxicité du SO augmente.

3
Le champ @KarlMorrison ref signifie dans quelle collection l'identifiant mentionné va être recherché.
Ankur Verma

quelle serait la différence entre populate et addToSet?
Winnemucca

1
où est la référence pour by:selectro
Muhammad Umer

1
@KarlMorrison Les documents pour "ref" sont enterrés dans les documents pour populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez


1

Réponse tardive, mais ajoutant que Mongoose a également le concept de sous- documents

Avec cette syntaxe, vous devriez être en mesure de référencer votre en userSchematant que type dans votre exemple 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}],
});

Notez le postedBychamp mis à jour avec type userSchema.

Cela incorporera l'objet utilisateur dans la publication, enregistrant une recherche supplémentaire requise en utilisant une référence. Parfois, cela peut être préférable, d'autres fois, la route ref / populate peut être la voie à suivre. Cela dépend de ce que fait votre application.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.