Tengo este modelo de mangosta:
var user = new Schema({ email : {type: String}, firstName: {type: String}, lastName: {type: String}, username: {type:String}, password: {type:String}, privacy : { displayEmail: {type: Boolean, default: true}, displayUsername: {type:Boolean: default: true}, displayfirstName: {type:Boolean: default: true}, displaylastName: {type:Boolean: default: true} }) Supongamos que el usuario establece el valor de displayLastName displayEmail false .
Luego, tengo una solicitud GET simple que devuelve un objeto json con todos los detalles de los usuarios. ¿Cómo puedo consultar mongo para devolver solo los campos que tienen true en el objeto de privacidad? Si displayfirstName es verdadero, entonces se debe devolver el valor de firstName .
Actualizar
var user = new Schema({ email : {type: String}, firstName : {type: String}, lastName : {type: String}, username : {type:String}, password : {type:String}, privacy : { displayEmail : {type: Boolean, default: true}, displayUsername : {type:Boolean, default: true}, displayfirstName : {type:Boolean, default: true}, displaylastName : {type:Boolean, default: true}, displayAddress : {type: Boolean, default: true}, // new displayPhone : {type: Boolean, default: true} // new }, extraInfo : { userAddress : {type:String}, // new userPhone : {type: String} // new } })¿Cómo puedo verificar condicionalmente el campo de dirección y teléfono?
La única manera que se me ocurre es a través de una canalización de agregación que tiene un operador $project con una expresión $cond que evalúa la condición y devuelve el valor de una de las otras dos expresiones según la lógica evaluada.
Tomemos, por ejemplo, ejecutar la siguiente canalización le dará un documento que muestra todos los campos, pero sus valores dependen de lo que tengan los campos del subdocumento de visualización; si es cierto, se devuelve el valor real; de lo contrario, se devuelve un valor nulo:
User.aggregate([ { "$project": { "email": { "$cond": ["$privacy.displayEmail", "$email", null] }, "firstName": { "$cond": ["$privacy.displayfirstName", "$firstName", null] }, "lastName": { "$cond": ["$privacy.displaylastName", "$lastName", null] }, "username": { "$cond": ["$privacy.displayUsername", "$username", null] } } } ]).exec(function(err, users){ if (err) throw err; console.log(JSON.stringify(users, null, 4)); }) Siguiendo su otra pregunta de los comentarios, para verificar condicionalmente los campos de address y phone AND filtrar la colección usando la identificación de un parámetro GET , ejecute la canalización con un operador $match que actúa como una consulta y luego agregue los campos de información adicionales visualización condicional en su $project :
var userId = mongoose.Schema.Types.ObjectId(req.parameter.userId); User.aggregate([ { "$match": { "_id": userId } }, { "$project": { "email": { "$cond": ["$privacy.displayEmail", "$email", null] }, "firstName": { "$cond": ["$privacy.displayfirstName", "$firstName", null] }, "lastName": { "$cond": ["$privacy.displaylastName", "$lastName", null] }, "username": { "$cond": ["$privacy.displayUsername", "$username", null] }, "userAddress": { "$cond": ["$privacy.displayAddress", "$extraInfo.userAddress", null] }, "userPhone": { "$cond": ["$privacy.displayPhone", "$extraInfo.userPhone", null] } } } ]).exec(function(err, users){ if (err) throw err; console.log(JSON.stringify(users, null, 4)); })