You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB Category模型自引用subcategory字段填充为空问题排查求助

问题1:异步执行顺序错误

你使用了async.parallel执行两个分类创建任务,该方法会同时启动所有任务,不会等待前一个任务执行完成。因此创建Category 2的任务启动时,Category 1还没完成save操作,categories数组仍为空,categories[0]为undefined,subcategory自然无法写入有效值。

问题2:自引用Schema定义错误

subcategory: [ this ]不符合Mongoose自引用的规范,Mongoose无法正确识别该字段的存储类型,就算传了有效值也无法正常入库。自引用字段应该存储关联文档的ObjectId,再通过ref指向自身模型即可。


修正后的Category Model代码

var Schema = mongoose.Schema;

var CategorySchema = new Schema({
  subheading: { type: String, required: true },
  // 修正自引用定义,存储关联分类的ObjectId,ref指向当前模型名
  subcategory: [{ type: Schema.Types.ObjectId, ref: 'Category' }],
  document: [{ type: Schema.Types.ObjectId, ref: 'Document' }],
});

//Export model
module.exports = mongoose.model('Category', CategorySchema);

修正后的populatedb.js代码

var categories = []
function categoryCreate(subheading, sub_cat, doc, cb) {
  categorydetail = {
    subheading: subheading
  }
  
  if (sub_cat != false) categorydetail.subcategory = sub_cat
  if (doc != false) categorydetail.document = doc
  
  var category = new Category(categorydetail);
       
  category.save(function (err) {
    if (err) {
      cb(err, null)
      return
    }
    console.log('New Category: ' + category);
    categories.push(category)
    cb(null, category)
  }  );
}

function createCategory(cb) {
  // 改用async.series串行执行,先完成分类1创建,再执行分类2创建
  async.series([
      function(callback) {
        categoryCreate('Category 1', false, documents[0], callback);
      },
      function(callback) {
        // 此时分类1已创建完成,categories[0]有有效值,传入_id数组即可
        categoryCreate('Category 2', [categories[0]._id], documents[1], callback);
      }
      ],
      cb);
}

后续查询分类需要带出子分类完整信息时,调用.populate('subcategory')即可自动关联查询对应内容。

内容的提问来源于stack exchange,提问作者PurplePineapple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:12:05