Подтвердить что ты не робот

Множество населенных пунктов - mongoosejs

Просто простой запрос, например, с двойной ссылкой в ​​модели.

Схема/Модель

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);

Query

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

Я уже пробовал что-то вроде

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

Фактически работает только одна из населенных пунктов.

Итак, как сделать работу двух населенных пунктов?

4b9b3361

Ответ 1

Вы уже используете правильный синтаксис:

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

Возможно, meal ObjectId из заказа не находится в коллекции Meals?

Ответ 2

ОБНОВИТЬ:
Это решение остается для версии 3.x Mongoose
http://mongoosejs.com/docs/3.8.x/docs/populate.html
но больше не документируется для> = 4.x версий Mongoose, и поэтому ответ от @JohnnyHK пока является единственным действительным.

ОРИГИНАЛЬНАЯ ПОЧТА
Если вы используете Mongoose> = 3.6, вы можете передать пробелами строку с именами путей для заполнения:

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

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

Ответ 3

Возможно, это уже решено, но это мое мнение о множественном и глубоком населении в 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 username
        console.log(order.meal.value);    // you get the idea
    }
});

Есть, вероятно, другие способы сделать это, но это делает очень читабельный код для начинающих (как я)

Ответ 4

у меня та же проблема, но моя ошибка не в населении, у меня ошибка в модели

если ты это сделаешь

неисправленный

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

правильный

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

Вы должны поместить массив вокруг объекта, как это