我是mongo DB的新手。我正在使用MEAN堆栈开发应用程序。在我的后端我有两个型号 - 功能和放大器项目。
项目架构有一个名为“features”的属性,它是一个Feature对象数组。
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var ProjectSchema = new Schema({
name: {
type: String,
default: '',
trim: true
},
features:{
type: [Schema.ObjectId],
ref: 'Feature'
}
});
/**
* Statics
*/
ProjectSchema.statics.load = function(id, cb) {
this.findOne({
_id: id
})
.populate('features')
.exec(cb);
};
mongoose.model('Project', ProjectSchema);
请注意,我有功能和项目架构的单独文件。我正在将两个模式注册为mongoose模型。 我还有一个控制器用于导出以下中间件功能的项目:
'use strict';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Project = mongoose.model('Project'),
Testcase = mongoose.model('Feature'),
_ = require('lodash');
/**
* Find project by id
*/
exports.project = function(req, res, next, id) {
Project.load(id, function(err, project) {
if (err) return next(err);
if (!project) return next(new Error('Failed to load project ' + id));
console.log(project.features.length);
req.project = project;
next();
});
};
由于我在Project模式的静态加载函数中使用了“.populate('features')”,我原本期望上面的项目对象中的Feature对象的所有细节。但它没有发生,它为features属性返回一个空数组。谁能告诉我,我在这里失踪了什么?
答案 0 :(得分:2)
项目架构有一个名为“features”的属性,它是一个Feature对象数组。
小心。您需要的是一个与Feature文档对应的ObjectIds数组。
我认为你需要像这样指定project.features模式:
features: [{type: Schema.ObjectId, ref: 'Feature'}]
填充函数仅在代码和数据都100%正确并且很容易出错时才有效。您可以发布正在加载的项目文档的示例数据吗?我们需要确保features
实际上是一个数组,实际上包含ObjectIds而不是字符串或对象等。