2016-07-29 2 views
0

Я пытаюсь использовать функцию мангуста заселить, но в ответ я получаю пустой массив, я видел нескольких сообщений относительно этогоMongoose заселить возвращение пустого массива

var MerchantSchema = new mongoose.Schema({ 
    packages: [{ $type: mongoose.Schema.Types.ObjectId, ref: 'Package'}] 
}, 
{ 
    typeKey: '$type', 
    timestamps: { createdAt: 'created_at', updatedAt: 'updated_at'} 
}); 

module.exports = mongoose.model('Merchant', MerchantSchema); 

Это мое определение схемы для базовой модели.

var mongoose = require ('mongoose');

var PackageSchema = new mongoose.Schema({ 
    merchant_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Merchant' }, 
    name: String, 
    original_price: Number, 
    discounted_price: Number 
}); 

module.exports = mongoose.model('Package', PackageSchema); 

И это модель, о которой я говорю. Данные внутри модели пакета и модели Merchant сохраняются просто отлично.

Merchant document

Package document

Но если запрос с использованием функции заполнения Я возвращается пустая строка

Merchant 
.findById(req.params.id, 'packages') 
.populate('packages') 
.exec(function (err, merchant) { 
    if (err) 
     next(err); 
    else 
     res.status(200).json(merchant); 
}); 

Выход:

{ 
    "_id": "579b3b2dc2e8d61c0ecd2731", 
    "packages": [] 
} 

Может кто-нибудь помочь мне

Обновление:

Хорошо, что-то действительно странное происходит. Если я попытаюсь заполнить документ пакета merchant_id, он работает, но не наоборот.

Package 
    .find() 
    .populate('merchant_id') 
    .exec(function (err, packages) { 
     if(err) 
      next(err); 
     else 
      res.status(200).json(packages); 
    }); 

Выход:

[ 
    { 
    "_id": "579b3b51c2e8d61c0ecd2732", 
    "name": "Hair + Nails", 
    "original_price": 600, 
    "discounted_price": 400, 
    "merchant_id": { 
     "_id": "579b3b2dc2e8d61c0ecd2731", 
     "updated_at": "2016-07-29T11:17:37.474Z", 
     "created_at": "2016-07-29T11:17:01.216Z", 
     "name": "VLCC", 
     "logo_image": "http://vlccwellness.com/India/wp-content/uploads/2015/09/logo1.png?", 
     "cover_image": "http://image3.mouthshut.com/images/imagesp/925053993s.jpg?", 
     "__v": 1, 
     "tags": [], 
     "packages": [ 
     "579b3b51c2e8d61c0ecd2732" 
     ], 
     "work_hours": { 
     "opening_time": 1000, 
     "closing_time": 2100, 
     "holiday": "Sunday" 
     }, 
     "information": { 
     "description": "Lorem Ipsum", 
     "gender": "Men", 
     "services": [ 
      "Hair" 
     ], 
+0

Какая версия Mongoose? –

ответ

1

Использование типа InstEd в $ типа в MerchantSchema.

var MerchantSchema = new mongoose.Schema({ 
    packages: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Package'}] 
}, 
{ 
    typeKey: '$type', 
    timestamps: { createdAt: 'created_at', updatedAt: 'updated_at'} 
}); 

module.exports = mongoose.model('Merchant', MerchantSchema); 

Проверьте есть массив ObjectId против пакетов в вашем торговом документе.

0

Вы можете попробовать путем удаления второго параметра из findBbyId:

Merchant 
.findById(req.params.id) 
.populate('packages') 
.exec(function (err, merchant) { 
    if (err) 
     next(err); 
    else 
     res.status(200).json(merchant); 
}); 
+0

Пробовал, все еще получая пустой массив – Parichit

0

Хорошо, потому что ваше поле packages на вашем Schema - это массив, в котором вы должны заполнить его как массив.

Попробуйте

.populate([ 
    {path:'packages', model:Package} 
]) 

Package порога является экземпляром вашего пакета модели.

0

Убедитесь, что массив пакетов в схеме Merchant содержит ObjectIds строки типа (не номер). Вы можете обеспечить это чем-то вроде:

merchant.packages.map(r => { r._id = r._id + ''; }); 
Смежные вопросы