猫鼬虚拟返回null

时间:2018-11-15 09:25:40

标签: node.js mongodb mongoose mongoose-schema

我有一个Person模式:

const person = new mongoose.Schema({
    name: String,
    birthday: Date,
    sex: String
},
{
    toObject: { virtuals: true },
    toJSON: { virtuals: true }
});

person.virtual('tasks', {
    ref: 'task',
    localField: '_id',
    foreignField: 'person'
});

export default mongoose.model('person', person);

还有一个具有person字段的任务:

const schema = new mongoose.Schema({

    person: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'person',
        required: true
    },

    name: String
});

export default mongoose.model('task', schema);

还有我的API来检索一个人:

api.get('/person/:id', async (req, res) => {
    let personID = req.params.id;

    if (personID) {
        let person = await Person.findById(personID);

        if (person)
            res.json(person);
        else
            res.status(404).end();
    }
    else {
        res.status(400).end();
    }
});

当我向一个人查询API时,tasks总是null,有什么想法吗?

谢谢

更新

我尝试过:

let person = await Person.findById(personID).populate('tasks').exec();

,它仍然返回null

2 个答案:

答案 0 :(得分:2)

  

在查询中使用populate

能否请您检查以下查询之一

let person = await Person.findOne({ _id: personID })
  .populate('tasks')
  .exec((error, personData)
    => personData);

OR

let person = await Person.findById(personID)
  .populate('tasks')
  .exec((error, personData) => personData);
  

参考链接:http://thecodebarbarian.com/mongoose-virtual-populate

答案 1 :(得分:0)

好,我发现了问题,我在设置虚拟机之前正在注册模型(在我围绕mongoose.Schema编写的一些包装器中)。