我有两个型号。项目和服务器。一个项目有很多服务器。许多服务器都有一个项目。这适用于服务器。项目字段已正确填充。但是项目中的服务器字段未填充。
模式如下所示:
var ProjectSchema = new Schema({
name: String,
created: String,
updated: String,
servers: [{
type: Schema.ObjectId,
ref: 'Server'
}]
});
var ServerSchema = new Schema({
name: String,
iheap: Number,
mheap: Number,
node: String,
cell: String,
cluster: String,
stage: String,
created: String,
updated: String,
project: {
type: Schema.ObjectId,
ref: 'Project'
}
});
服务器已填充项目字段。
[
{
"_id": "55899afad599d0cabdfa60c7",
"created": "2015-06-23T19:44:26+02:00",
"stage": "Test",
"cluster": "AppServerCluster01",
"cell": "Cell01",
"node": "Node01",
"mheap": 1,
"iheap": 1,
"name": "a",
"project": {
"_id": "55899af1d599d0cabdfa60c6",
"created": "2015-06-23T19:44:17+02:00",
"name": "asd",
"__v": 0,
"servers": []
},
"__v": 0
}
]
项目中没有填充服务器字段
[
{
"_id": "55899af1d599d0cabdfa60c6",
"created": "2015-06-23T19:44:17+02:00",
"name": "asd",
"__v": 0,
"servers": []
}
]
这就是我填充的方式。 项目:
exports.getProjects = function(req, res) {
Project.find({}).populate("servers").exec(function(err, projects) {
if(err) {
console.log("Error: " + err);
res.send(err);
} else {
console.log("Got projects " + projects);
res.json(projects);
}
});
};
服务器:
exports.getServers = function(req, res) {
Server.find({}).populate('project').exec(function(err, servers) {
if(err) {
console.log('Error: ' + err);
res.send(err);
} else {
res.json(servers);
}
});
};
这就是我插入的方式
exports.createProject = function(req, res) {
var project = new Project();
project.name = req.body.name;
project.created = moment().format();
project.save(function(err) {
if(err) {
console.log("Error: " + err);
res.send(err);
} else {
console.log("Project created. project: " + project);
res.json({ 'message': 'Project greated', 'project': project });
}
});
};
exports.createServer = function(req, res) {
var server = new Server();
server.project = req.body.project;
server.name = req.body.name;
server.iheap = req.body.iheap;
server.mheap = req.body.mheap;
//server.node = req.body.node;
//server.cell = req.body.cell;
//server.cluster = req.body.cluster;
server.node = "Node01";
server.cell = "Cell01";
server.cluster = "AppServerCluster01";
server.stage = req.body.stage;
server.created = moment().format();
server.save(function(err) {
if(err) {
console.log('Error: ' + err);
res.send(err);
} else {
console.log('Server created. ' + server);
res.json({ "message": "Server created!", "server": server });
}
});
};
答案 0 :(得分:1)
Mongoose的人口使用两个不同的步骤:
必须明确地进行协会;换句话说,您需要手动将Server
模型实例与Project
模型实例相关联。
为服务器实例执行此操作看起来没问题:
server.project = req.body.project;
(我假设req.body.project
是项目的_id
?)
但是,您未创建Project
和Server
之间的关系。这是一个(相当详细)的例子,说明如何做到这一点:
exports.createServer = function(req, res) {
var server = new Server({
project : req.body.project,
name : req.body.name,
iheap : req.body.iheap,
mheap : req.body.mheap,
node : "Node01",
cell : "Cell01",
cluster : "AppServerCluster01",
stage : req.body.stage,
created : moment().format(),
});
server.save(function(err, serverInstance) {
if(err) {
console.log('Error: ' + err);
res.send(err);
} else {
Project.findById(req.body.project, function(err, projectInstance) {
if (err) {
console.log('Error: ' + err);
res.send(err);
} else {
// This is where the relation is made:
projectInstance.servers.push(serverInstance);
// We need to save the project instance because we changed it:
projectInstance.save(function(err) {
if (err) {
console.log('Error: ' + err);
res.send(err);
} else {
console.log('Server created. ' + server);
res.json({ "message": "Server created!", "server": server });
}
});
}
});
}
});
};