Mongoose .populate() 返回一个空数组

问题描述

抱歉,我知道有很多问题都在问同样的问题,但我找不到任何可以为我解决问题的答案!

我正在尝试使用 mongoose populate 函数来填充架构的 ID,但它只返回一个空数组。如果我不使用 populate 函数,ID 就在数组中,但使用它似乎会删除它们。

我的路线和模型很简单,因为我只是想学习它,这更令人困惑为什么它是错误的!我以为我完全按照教程....

这些是我的架构:

var SeasonSchema = new Schema(
  {
    name: {type: String,required: true,enum: ['Spring','Summer','Autumn','Winter']},description: {type: String,maxLength: 300}
  }
);
var FruitSchema = new Schema(
  {
    name: {type: String,required: [true,'All fruits have names.'],maxLength: 50},maxLength: 300},season: [{type: Schema.Types.ObjectId,ref: 'Season',required: true}],price: {type: Number,min: 0,max: 9.99,required: true},stock: {type: Number,max: 999,required: true}
  }
);

这是我要开始工作的控制器:(只需填充 Fruit's Season 字段。

exports.fruit_detail = function(req,res,next) {
    Fruit.findOne({name: req.params.name})
    .populate('season')
    .exec(function (err,fruit) {
      if (err) {return next(err);}
      if (fruit==null) {
        var err = new Error('Fruit not found');
        err.status = 404;
        return next(err);
      }
      res.render('fruit_detail',{title: fruit.name,fruit: fruit});
    });
};

感谢您的帮助。我已经无能为力了。

解决方法

ret 是一种异步方法,需要正确调用:

.populate()

然后您必须导入您的 exports.fruit_detail = async function(req,res,next) { await Fruit.findOne({name: req.params.name}) .populate('season') .execPopulate(function (err,fruit) { if (err) {return next(err);} if (fruit==null) { var err = new Error('Fruit not found'); err.status = 404; return next(err); } res.render('fruit_detail',{title: fruit.name,fruit: fruit}); }); }; 方法并异步调用它:fruit_deail

,

巨大的手掌表情符号。

问题是所引用的季节 ID 来自不存在的季节。我在填充数据库时以某种方式进行了重复,并且我删除了错误的。感觉我浪费了两天的生命,但至少它是排序的!