Search code examples
node.jsmongoosemongoose-populate

Can't get the result of Mongoose virtual populate


I have a circle model in my project:

var circleSchema = new Schema({
    //circleId: {type: String, unique: true, required: true},
    patientID: {
        type: Schema.Types.ObjectId,
        ref: "patient"
    },
    circleName: String,
    caregivers: [{
        type: Schema.Types.ObjectId
    }],
    accessLevel: Schema.Types.Mixed
});

circleSchema.virtual('caregiver_details', {
    ref: 'caregiver',
    localField: 'caregivers',
    foreignField: 'userId'
});

caregiver schema:

var caregiverSchema = new Schema({
    userId: {
        type: Schema.ObjectId,
        unique: true
    }, //objectId of user document
    detailId: {
        type: Schema.ObjectId,
        ref: "contactDetails"
    },
    facialId: {
        type: Schema.ObjectId,
        ref: "facialLibrary"
    }, //single image will be enough when using AWS rekognition
    circleId: [{
        type: Schema.Types.ObjectId,
        ref: "circle"
    }], //multiple circles can be present array of object id
});

Sample Object:

{
    "_id": ObjectId("58cf4832a96e0e3d9cec6918"),
    "patientID": ObjectId("58fea8ce91f54540c4afa3b4"),
    "circleName": "circle1",
    "caregivers": [
        ObjectId("58fea81791f54540c4afa3b3"),
        ObjectId("58fea7ca91f54540c4afa3b2")
    ],
    "accessLevel": {
        "location\"": true,
        "notes": false,
        "vitals": true
    }
}

I have tried virtual populate for Mongoose but I am unable to get it to work. This seems to be the exact same problem: https://github.com/Automattic/mongoose/issues/4585

circle.find({
    "patientID": req.user._id
}).populate('caregivers').exec(function(err, items) {
    if (err) {
        console.log(err);
        return next(err)
    }
    res.json(200, items);
});

I am only getting the object ids in the result. It is not getting populated.


Solution

  • Figured out what the problem was. By default, the virtual fields are not included in the output. After adding this in circle schema:

    circleSchema.virtual('caregiver_details',{
        ref: 'caregiver',
        localField: 'caregivers',
        foreignField: 'userId'
    });
    
    circleSchema.set('toObject', { virtuals: true });
    circleSchema.set('toJSON', { virtuals: true });
    

    It now works perfectly.