2017-07-02 3 views
0

J'ai un tableau comme un sous-document dans le modèle Mongoose défini comme suit:Comment trouver des éléments de tableau avec Mongoose?

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var schema = Schema({ 
    author: { type: Schema.Types.ObjectId, ref: 'Author' }, 
    pages: [{ 
     number: Number, 
     type: { type: String, enum: ['boring', 'fun']}, 
    }] 
}); 

module.exports = mongoose.model('Book', schema); 

Maintenant, je veux obtenir le nombre total de pages 'fun' à travers tous les livres par un auteur. Beaucoup de questions similaires (et réponses) j'ai trouvé comment trouver Book s avec des pages amusantes dans ce scénario, mais je veux obtenir un tableau de toutes les pages amusantes, ou au moins la longueur de ce tableau, mais si possible, je voudrais obtenir le tableau lui-même. Comment puis-je faire ceci?

Merci,

+0

Essayez (non testé, va ajouter une réponse si elle est correcte): Book.aggregate ( {$ détendre: "pages $"}, { groupe $: { _id: "pages.type de $", nombre: {somme de $: 1}}} ) – nadavvadan

+0

@nadavvadan Merci! Il semble que ça marche. Mais je viens de me rendre compte que j'avais besoin d'un filtre de plus, au lieu de tous les livres, je dois sélectionner des livres seulement par un certain auteur. Si ce ne sera pas beaucoup à demander, pouvez-vous s'il vous plaît ajouter cela aussi? :) Merci encore, – jeff

+0

essayez ceci: Book.aggregate ({$ match: {auteur: ObjectId ("12-octets-de-hex")}}, {$ unwind: "$ pages"}, {$ group: { _id: "$ pages.type", compte: {$ sum: 1}}}) – nadavvadan

Répondre

1

Je crois que, en dehors de la syntaxe, cela est assez explicite:

Book.aggregate(

    { 
     $match: { 
      author: ObjectId("12-bytes-of-hex") 
     } 
    }, 

    { $unwind: "$pages" }, 

    { $group: { 
     _id: "$pages.type", 
     count: { $sum: 1 } 
    }} 
) 
+0

Je ne comprends pas btw, comment ce filtre filtre-t-il les pages selon 'type == 'fun''? – jeff

+0

Il ne fait pas exactement cela; il regroupe les pages par type de page et compte chaque groupe. Vous pouvez également utiliser le framework mapReduce de mongo pour obtenir le nombre de pages du type de page 'fun', mais je pense que la solution ci-dessus est plus simple. – nadavvadan