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
Gorkem Yurtseven
la source

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
});
nicksweet
la source
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
19

Addendum: Personne n'a mentionné "Populate" --- cela vaut vraiment la peine de regarder la méthode de peuplement des mangoustes: explique également le référencement des documents croisés

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

fino
la source
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.

D. Lowe
la source