web-dev-qa-db-fra.com

Peuple virtuel de mangouste

J'ai un modèle de cercle dans mon projet:

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

schéma du soignant:

var cargiverSchema = 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
});

Exemple d'objet:

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

J'ai essayé le peuplement virtuel pour mongoosejs mais je n'arrive pas à le faire fonctionner. Cela semble être exactement le même problème: 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);
    });

J'obtiens seulement l'ID d'objet dans le résultat. Il ne se remplit pas.

16
Himanshu Jain

Compris quel était le problème. Par défaut, les champs virtuels ne sont pas inclus dans la sortie. Après avoir ajouté cela dans le schéma circulaire:

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

circleSchema.set('toObject', { virtuals: true });
circleSchema.set('toJSON', { virtuals: true });

Cela fonctionne maintenant parfaitement.

29
Himanshu Jain

Si vous utilisez la méthode expressJs res.json , il suffit d'ajouter uniquement:

yourSchema.set('toJSON', { virtuals: true });

Ou vous pouvez utiliser directement toJSON/toObject :

doc.toObject({ virtuals: true })) // or doc.toJSON({ virtuals: true }))
1
zemil