2012-05-18 1 views
0

Comment puis-je définir un DBref en utilisant le document référencé lui-même et avoir toujours accès au document comme s'il était renseigné sur l'objet parent?Comment puis-je définir un document comme DBref dans Mongoose et avoir toujours accès au document

Si j'ai un schéma simple avec une configuration de champ comme un champ dbref:

var PostSchema = new Schema({ 
    'title': String, 
    '_author', { type: Schema.ObjectId, ref: 'users'} 
}); 
var Post = mongoose.model('posts', PostSchema); 

var UserSchema = new Schema({ 
    'name': String 
}); 
Var User = mongoose.model('users', UserSchema); 

Si je tente de le faire:

var john = User.findOne({'name': 'john'}); 
var post = new Post({'title': 'My Post'}); 
post._author = john; 

post.save(function(err) { 
    if (!err) { 
    console.log(post._author); 
    } 
}); 

Le post._author propriété a une valeur de l'auteur._id. Je préférerais que la propriété _author ait la valeur du document auteur complet (comme si j'avais effectué une requête de recherche sur la collection de posts et rempli l'objet auteur). Ma seule solution est d'effectuer une telle requête findOne à l'intérieur de la fonction de rappel de sauvegarde et de m'assurer que je la réintègre dans l'auteur ... cela me semble un peu inutile car je dois essentiellement me renseigner quand j'ai déjà toutes les informations .

Des suggestions? Merci

Répondre

0

C'est le but de la fonctionnalité populate de Mongoose. Dans votre exemple, vous définissez post._author = john._id lors de la création du poste, puis lors de l'interrogation de la collection de post que vous utiliser le code comme celui-ci pour remplir _author avec le plein objet utilisateur:

post.findOne({'title': 'My Post'}).populate('_author').exec(function (err, post) { 
    // post._author contains a User model instance 
}); 
+0

Oui, cela fonctionne très bien quand Je récupère juste les données, mais après avoir réglé les données, dois-je alors 'findOne' comme vous le décrivez? Il semble un peu étrange d'avoir à émettre une requête 'find' quand j'ai déjà les données requises. – jonotron

Questions connexes