Tratando de encontrar una manera de llenar un virtual solo cuando el modelo recibe un comando findOne en lugar del comando find. Envolver la función virtual dentro de una declaración condicional no funciona, ya que el esquema ya no la reconoce, por lo que no sé cómo lograrlo. Si no puede usar condicionales al configurar virtuales, ¿no es posible crear virtuales solo en ciertas circunstancias?
virtuales originales
Schema.virtual( 'stats' , { ref: 'Stat', foreignField: 'account', localField: '_id', });Condicional dentro del gancho Pre Find no funciona:
Schema.pre( /^find/ , function( next ) { if ( this.op === 'findOne' ) { Schema.virtual( 'stats' , { ref: 'Stat', foreignField: 'account', localField: '_id', }); } }SOLUCIÓN:
Encontré una solución configurando una variable 'find_one' en el gancho Pre Find y eliminando el virtual dentro del método toJSON si la variable devuelve false. Todavía espero una mejor manera de lograr esto, pero esto servirá si nadie tiene una mejor solución.
let find_one ; Schema.pre( /^find/ , function( next ) { this.op === 'findOne' ? find_one = true : find_one = false ; } Schema.methods.toJSON = function () { if ( !find_one ) delete this.stats ; return data; };