Невозможно заполнить вложенный массив - PullRequest
0 голосов
/ 04 октября 2019

Я знаю, что об этом спрашивали миллион раз, но, похоже, это не работает для меня. Я не могу найти способ заполнить ссылки в объекте при получении его из базы данных. Независимо от того, что я пытаюсь, он либо возвращает пустой список, либо просто список идентификаторов. Что я тут не так делаю?

displayInventory: (req, res)=>{
    Merchant.find({otherId: merchantId})
        .populate({
            path: "ingredients", 
            populate: {
                path: "ingredient", 
                model: "Ingredient"
            }
        })
        .then((merchant)=>{
            console.log(merchant);
            if(merchant){
                return res.render("./inventory/inventory", {merchant: merchant});
            }else{
                return res.redirect("/merchant/new");
            }
        })
        .catch((err)=>{
            console.log(err);
            return res.render("error");
        });
}

const MerchantSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    otherId: {
        type: String,
        required: true
    },
    lastUpdatedTime: {
        type: Date,
        default: Date.now
    },
    ingredients: [{
        ingredient: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Ingredient"
        },
        quantity: {
            type: Number,
            min: [0, "Quantity cannot be less than 0"]
        }
    }],
    recipes: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: "Recipe"
    }]
});

Ответы [ 3 ]

1 голос
/ 04 октября 2019

Обратитесь к своей схеме, похоже, что вам просто нужно сделать:

Merchant.find({cloverId: merchantId}).populate("ingredients.ingredient")...
0 голосов
/ 04 октября 2019

Я отвечу на свой вопрос, если у других возникнут аналогичные проблемы. Моя проблема была в том, что я переименовал некоторые переменные, но забыл сделать это при сохранении данных в базу данных. Глупая ошибка, но просто напоминание быть осторожным при рефакторинге. Я использовал ответ Кунга Ле Нгока, он отлично работает.

0 голосов
/ 04 октября 2019

Вы можете попробовать следующий код.

Merchant.find({otherId: merchantId})
  .populate({ path: 'ingredients' })
  .exec(function(err, docs) {

    var options = {
      path: 'ingredients.components',
      model: 'Ingredient'
    };

    if (err) return res.json(500);
    Merchant.populate(docs, options, function (err, merchant) {
      res.json(merchant);
    });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...