Je suis tombé sur la ligne de code suivante que je ne pouvais pas comprendre, bien qu'il existe de nombreux didacticiels qui donnent des informations relatives à des exemples de populate
mais aucun n'explique ce que cela signifie exactement. Voici un exemple
var mongoose = require('mongoose'), Schema = mongoose.Schema
var PersonSchema = new Schema({
name : String,
age : Number,
stories : [{ type: Schema.ObjectId, ref: 'Story' }]
});
var StorySchema = new Schema({
_creator : {
type: Schema.ObjectId,
ref: 'Person'
},
title : String,
fans : [{ type: Schema.ObjectId, ref: 'Person' }]
});
var Story = mongoose.model('Story', StorySchema);
var Person = mongoose.model('Person', PersonSchema);
Story.findOne({ title: /Nintendo/i }).populate('_creator') .exec(function (err, story) {
if (err) ..
console.log('The creator is %s', story._creator.name);
// prints "The creator is Aaron"
})
populate()
fonction est mangouste est utilisée pour remplir les données à l'intérieur de la référence. Dans votre exemple, StorySchema
a un champ _creator
Qui fera référence au champ _id
Qui est essentiellement le ObjectId
du document mongodb.
la fonction populate () peut accepter une chaîne ou un objet en entrée.
Où chaîne est le nom du champ qui doit être rempli. Dans votre cas, c'est _creator
. Après que mangouste ait trouvé un doc de mongodb et le résultat est comme ci-dessous
_creator: {
name: "SomeName",
age: SomeNumber,
stories: [Set Of ObjectIDs of documents in stories collection in mongodb]
},
title: "SomeTitle",
fans: [Set of ObjectIDs of documents in persons collection in mongodb]
populate peut également accepter l'objet comme entrée.
Vous pouvez trouver les documents de populate()
fonction de mangouste ci-dessous. http://mongoosejs.com/docs/2.7.x/docs/populate.html
J'ai rencontré cette question au hasard, mais je sens que je dois aider ici, même si elle est ancienne car je ne suis pas convaincue par la façon dont elle est expliquée:
Fonction populate () populate ...
Cela pourrait être très clair pour les anglophones natifs, mais peut-être pas pour les autres.
Remplir remplacera automatiquement le chemin spécifié dans le document, par le (s) document (s) d'autres collections
Prenons votre exemple
Story.findOne({ title: Nintendo })
Rendra une histoire de ce genre:
{
_creator : A0jfdSMmEJj*9, //id of the creator (totaly random, just for a clear example)
title : Nintendo,
fans : [r432i900fds09809n, fdsjifdsjfueu88] // again, totaly random that i've typed here
}
}
Dans certains cas, ce genre de demande serait suffisant, car nous ne nous soucions pas de l'auteur ou des fans, donc avoir une pièce d'identité ne nous dérangera pas beaucoup.
Mais dans le cas où j'ai besoin de cet auteur, je devrai faire une autre demande pour le trouver dans la base de données. Sauf qu'ici, dans mangouste, nous avons une fonction intelligente appelée populate () que nous pouvons enchaîner à notre demande précédente afin d'obtenir directement ces informations dans notre réponse sans faire explicitement une demande supplémentaire.
Story.findOne({ title: Nintendo }).populate('_creator')
reviendra
{
_creator : {
_id : A0jfdSMmEJj*9,
name: Sai,
age: 100,
stories : [fdsfdsfdsew38u, 89hr3232, ...]
},
title : Nintendo,
fans : [r432i900fds09809n, fdsjifdsjfueu88]
}
}
Mais peut-être, c'est trop d'informations, et nous ne voulons pas que les histoires qu'il a écrites, son âge et son nom soient suffisants. Le remplissage peut alors prendre un autre argument contenant le champ dont nous avons besoin
Story.findOne({ title: Nintendo }).populate('_creator', 'name age')
résultat ==>
{
_creator : {
name: Sai,
age: 100,
},
title : Nintendo,
fans : [r432i900fds09809n, fdsjifdsjfueu88]
}
}