web-dev-qa-db-fra.com

Plusieurs populations - mongoosejs

Juste une simple requête, par exemple avec une double référence dans le modèle.

Schéma/Modèle

var OrderSchema = new Schema({

    user: {
        type    : Schema.Types.ObjectId,
        ref     : 'User',
        required: true
    },

    meal: {
        type    : Schema.Types.ObjectId,
        ref     : 'Meal',
        required: true
    },
});

var OrderModel = db.model('Order', OrderSchema);

Requête

OrderModel.find()
    .populate('user') // works
    .populate('meal') // dont works
    .exec(function (err, results) {
         // callback
    });

J'ai déjà essayé quelque chose comme

.populate('user meal')
.populate(['user', 'meal'])

En fait, un seul des habitants fonctionne.

Alors, comment faire fonctionner deux populations?

33
mrzmyr

Vous utilisez déjà la syntaxe correcte de:

OrderModel.find()
    .populate('user')
    .populate('meal')
    .exec(function (err, results) {
         // callback
    });

Peut-être que le meal ObjectId de la commande n'est pas dans la collection Meals?

37
JohnnyHK

MISE À JOUR:
Cette solution reste pour la version 3.x de Mongoose
http://mongoosejs.com/docs/3.8.x/docs/populate.html
mais n'est plus documenté pour les versions> = 4.x de Mongoose et donc la réponse de @JohnnyHK est la seule valable pour le moment.

POSTE ORIGINAL
Si vous utilisez Mongoose> = 3.6, vous pouvez passer une chaîne délimitée par des espaces des noms de chemin à remplir:

OrderModel.find()
    .populate('user meal')
    .exec(function (err, results) {
         // callback
    });

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

25
Michel Sahli

Cela a probablement déjà été résolu, mais voici mon opinion sur la population multiple et profonde dans Mongodb> 3.6:

OrderModel.find().populate([{
    path: 'user',
    model: 'User'
}, {
    path: 'meal',
    model: 'Meal'
}]).exec(function(err, order) {
    if(err) throw err;
    if(order) {
        // execute on order
        console.log(order.user.username); // prints user's username
        console.log(order.meal.value);    // you get the idea
    }
});

Il existe probablement d'autres façons de le faire, mais cela rend le code très lisible pour les débutants (comme moi)

6
AlexanderDSmith

j'ai le même problème, mais mon erreur n'est pas dans populate, j'ai une erreur dans Model

si tu fais ça

non corrigé

user: {
 type: [Schema.Types.ObjectId],
 ref: 'User'
} 

correct

user: [{
 type: Schema.Types.ObjectId,
 ref: 'User'
}]

vous devez mettre un tableau autour de l'objet comme celui-ci

0
hamidreza nikoonia