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
相关产品推荐
相关产品推荐

