猫鼬在json中显示ref对象

时间:2018-07-28 21:18:29

标签: node.js express mongoose

我是猫鼬的新手,使用以下控制器:

const Creport = require('../models/creport.model.js');

exports.save = (req, res) => {
    const creport = new Creport({
        curso_id: req.body.curso_id,
        nombre: req.body.nombre,
        ....

    });

    creport.save()
    .then(data => {
        res.send(data);
    }).catch(err => {
        res.status(500).send({
            message: err.message
        });
    });
};

在creport.model.js中:

curso_id: {
    type: Schema.Types.ObjectId,
    ref: 'Curso'
},

这将创建一个json文件,例如:

{"curso_id":"5b5a14e8ej1a18ac0b5e5433","nombre":"el nombre",....}

在寻找时:

{"curso_id":"curso No. 1","nombre":"el nombre",....}

编辑: 使用填充:

exports.findAll = (req, res) =>  {


         Creport.find().populate('curso_id')
        .then(creports => {
            res.send(creports);
        }).catch(err => {
            res.status(500).send({
                message: err.message
            });
        });

};

将输出:

[{"_id":"5b5ce554967f6a36f0c84fe6","curso_id":{"_id":"5b5a14e8ej1a18ac0b5e5433","name":"curso No. 1"},"nombre":"el nombre"....}]

3 个答案:

答案 0 :(得分:0)

您可以使用填充方法,如果您阅读猫鼬文档,将会发现有一种非常简单的申请方法。

http://mongoosejs.com/docs/populate.html

答案 1 :(得分:0)

curso_id ObjectId 。返回的json确认了这一点。

语义是正确的。

您可能应该添加一个

curso_number: {
    type: Schema.Types.String
},

答案 2 :(得分:0)

要以这种格式返回数据,您需要使用 aggregate 方法。

在测试中,我创建了一个课程和一个Creport,然后执行了该汇总:

 CreportModel.aggregate([
    {"$match":{_id:creport._id}},
    {"$lookup":{
        from:"cursos",
        localField:"curso_id",
        foreignField:"_id",
        as:"cursos"
      }
      },
    {"$project":{"curso_id": {"$arrayElemAt":["$cursos.name",0]},"nombre": "$nombre","_id":0}}
    ])
    .then(result=>{
      console.log(result)
    })

结果:

Aggregate result

如果要在结果中添加更多字段,则需要更改 $ project 阶段。

例如

{"$project":{"curso_id": {"_id":1,"$arrayElemAt":["$cursos.name",0]},"nombre": "$nombre"}}
  • 0 :表示将删除退货中的字段
  • 1 :表示将在返回中显示该字段

猫鼬文档:Aggregate Lookup