Mongoose填充对象数组

时间:2015-06-24 11:18:12

标签: node.js mongodb mongoose

我有两个型号。项目和服务器。一个项目有很多服务器。许多服务器都有一个项目。这适用于服务器。项目字段已正确填充。但是项目中的服务器字段未填充。

模式如下所示:

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 });
        }
    });

};

1 个答案:

答案 0 :(得分:1)

Mongoose的人口使用两个不同的步骤:

  • 关联相关模型实例
  • 让Mongoose自动填充(运行相关查询)相关属性

必须明确地进行协会;换句话说,您需要手动将Server模型实例与Project模型实例相关联。

为服务器实例执行此操作看起来没问题:

server.project = req.body.project;

(我假设req.body.project是项目的_id?)

但是,您未创建ProjectServer之间的关系。这是一个(相当详细)的例子,说明如何做到这一点:

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 });
            }
          });
        }
      });
    }
  });

};
相关问题