2017-07-02 4 views
0

Ich habe ein Array als Subdokument im Mungo-Modell wie folgt definiert:Wie finden Sie Array-Elemente mit 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); 

Jetzt möchte ich über alle Bücher eines bestimmten Autors die Gesamtzahl der 'fun' Seiten zu bekommen. Viele ähnliche Fragen (und Antworten), die ich gefunden habe, besprechen, wie man in diesem Szenario Book s mit lustigen Seiten findet, aber ich möchte ein Array aller spaßigen Seiten oder zumindest die Länge dieses Arrays bekommen, aber wenn möglich, würde ich gerne Holen Sie sich das Array selbst. Wie kann ich das machen?

Danke,

+0

Try (ungetestet, wird als Antwort, wenn richtig hinzugefügt werden): Book.aggregate ( {$ entspannen: "$ Seiten"}, {$ group: { _id: "$ pages.type", Zahl: {$ Summe: 1}}} ) – nadavvadan

+0

@nadavvadan Danke! Es scheint, als ob es funktioniert. Aber ich habe gerade erkannt, dass ich noch eine Filterung brauchte, anstatt aller Bücher muss ich nur aus Büchern von einem bestimmten Autor auswählen. Wenn es nicht viel zu fragen gibt, können Sie das bitte auch hinzufügen? :) Danke nochmal, – jeff

+0

versuche das: Book.aggregate ({$ match: {author: ObjectId ("12-Byte-of-hex")}}, {$ unwind: "$ pages"}, {$ group: { _id: "$ pages.type", Anzahl: {$ sum: 1}}}) – nadavvadan

Antwort

1

Ich glaube, dass, abgesehen von Syntax, das ist ziemlich selbsterklärend ist:

Book.aggregate(

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

    { $unwind: "$pages" }, 

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

Ich verstehe nicht, BTW, wie filtert das Seiten nach 'type == 'fun''? – jeff

+0

Es tut nicht genau das; Es gruppiert die Seiten nach Seitentyp und zählt jede Gruppe. Sie können auch das mapReduce-Framework von mongo verwenden, um nur die Seitenzahlen für den Seitentyp "Spaß" zu erhalten, aber ich glaube, dass die obige Lösung einfacher ist. – nadavvadan

Verwandte Themen