How can I query matching MongoDB documents and return a subset of fields from an array of embedded documents?
If you want to return a subset of matching array elements in a MongoDB document, the best approach to do so is using the Aggregation Framework. The Aggregation Framework processes data similar to a Unix pipeline: the output of each aggregation stage is passed as input to the next:

db.etudiants.aggregate([
    // Find relevant documents: this can take advantage of an index, if applicable
    { $match: {
        'cours_reussis.nom_ecole': 'ISFCE',
    }},

    // Expand cours_reussis array into a stream of documents
    { $unwind: '$cours_reussis' },

    // Filter based on matching array elements
    { $match: {
        'cours_reussis.nom_ecole': 'ISFCE',
    }},

    // Project desired subset of fields
    { $project: {
        '_id': "$_id",
        'nom': '$nom',
        'prenom': '$prenom',
        'cours_reussis' : { 'nom_ecole': 1, date_reussite: 1 }
    }},

    // Regroup data as per the original document _id
    { $group: {
        _id: "$_id",
        nom: { $first: "$nom" },
        prenom: { $first: "$prenom" },
        cours_reussis: { $push: "$cours_reussis" }
    }}
])


You can debug the aggregation pipeline by starting with a single stage and then adding on additional stages one at a time assuming you are seeing the expected output.

Sample output from MongoDB 3.2:

{
  "_id": ObjectId("58462f40f8475aba9f391216"),
  "nom": "emile",
  "prenom": "zola",
  "cours_reussis": [
    {
      "date_reussite": 2015,
      "nom_ecole": "ISFCE"
    },
    {
      "date_reussite": 2015,
      "nom_ecole": "ISFCE"
    }
  ]
}