2017-05-24 2 views
0

J'essaye d'accomplir quelque chose de vraiment facile mais j'arrive toujours à échouer. Ce que j'essaye de faire est quand je reçois une demande de get sur mon serveur je veux renvoyer tous les documents MAIS juste les champs spécifiques peuplés.Renvoyer des champs spécifiques avec mongoose

Mon schéma est le suivant

var clientSchema = new Schema({ 
    name:{ 
     type: String, 
     required: true 
    }, 
    phone:{ 
     type: String, 
     required: true 
    }, 
    email:{ 
     type: String, 
     required: true 
    }, 
    address: { 
     type: String, 
     required: false 
    } 
}); 

var orderDetailsSchema = new Schema({ 
    //isn't added to frontend 
    confirmed:{ 
     type: Boolean, 
     required: true, 
     default: false 
    },  
    service:{ 
     type: String, 
     required: true 
    }, 
    delivery:{ 
     type: String, 
     required: false 
    }, 
    payment:{ 
     type: String, 
     required: false 
    }, 
    status:{ 
     type: String, 
     required: true, 
     default: "new order" 
    }, 
}); 

var orderSchema = new Schema({ 

    reference:{ 
     type: String, 
     required: true 
    }, 

    orderdetails: orderDetailsSchema, 

    client: clientSchema, 

    wheelspec: [wheelSchema], 

    invoice:{ 
     type: Schema.Types.ObjectId, 
     ref: 'Invoice' 
    } 


}); 

Ce que je veux revenir seulement client.phone et client.email, plus orderdetails.status mais toujours garder le terrain reference si possible

J'ai essayé d'utiliser lean() et populate() mais n'a pas eu de chance avec eux. Y a-t-il quelque chose d'absolument simple qui me manque? Ou ce que j'essaie de réaliser n'est pas si facile? Merci!

+1

à quoi ressemble votre appel Get? vous pouvez utiliser la projection mongodb – Astro

+0

besoin de voir votre requête actuelle – Alex

Répondre

1

Vous pouvez spécifier les champs à retourner comme ceci:

Order.findOne({'_id' : id}) 
     .select('client.phone client.email orderdetails.status reference') 
     .exec(function(err, order) { 
     // 
}); 

syntaxe alternative

Order.findOne({'_id' : id}) 
    .select('client.phone client.email orderdetails.status reference') 
    .exec(function(err, order) { 
     // 
}); 

J'ai fait un certain nombre d'hypothèses, mais vous devriez être en mesure de voir l'idée.

+1

Fonctionne comme je le voulais. Merci! –

0

Il suffit de faire comme ceci: -

Ordre est le nom du modèle qui est enregistré dans mangouste.

Order.findById(id) // set id you have to get 
    . populate('client') 
    .select('client.phone client.email orderdetails.status reference') 
    .exec(function(err, order) { 
     // 
});