2017-11-19 3 views
0

Ich versuche, meine Datenbank abzufragen ein bestimmtes Element aus einem Array zu bekommen, dann nur einen Teil dieses Arrays zu projizieren, hier ist der Code, den ich versucht:

{ $project : { 
    name: 1, 
    language : 1 , 
    season: [{ 
     $filter: { 
     input: "$seasons", 
     as: "s", 
     cond: { $eq: [ "$$s.number", saison ] } 
     } 
    }, { 
     $project: { 
     'episodes.number': 1 
     } 
    }] 
    } } 

Ich möchte nur die Jahreszeit erhalten, die mit der Nummer übereinstimmt, dann projiziere nur das Zahlenfeld.

Hier ist mein Schema:

{ 
    name: {type: String}, 
    seasons: [{ 
    number: Number, 
    episodes: [{number: Number, videos: [ 
     { 
     provider: String, 
     quality: String, 
     language: String, 
     added: { type: Date, default: new Date(1510272000000) } 
     } 
     ]}] 
    }] 
} 

Meine aktuelle Abfrage einen Fehler generiert: MongoError: Unbekanntes Ausdruck ‚$ Projekt‘, wenn ich die Filter ohne das $ Projekt tun, nachdem es funktioniert, aber dann ist es wieder ein ganzes Array statt dessen, was ich gerade brauche. Vielen Dank.

Antwort

1

Sie haben einen Fehler in Ihrer Aggregationspipeline. Was willst du sagen?

db.collectionName.aggregate([ 
    { 
     $project: { 
      name: 1, 
      language: 1, 
      season: { 
       $filter: { 
        input: "$seasons", 
        as: "s", 
        cond: { 
         $eq: ["$$s.number", saison] 
        } 
       } 
      } 
     } 
    }, 
    { 
     $project: { 
      'season.episodes.number': 1 
     } 
    } 
]) 

, und wenn Sie nur eine einzige Nummer, ohne die komplette Array-Struktur zurückkehren wollen:

db.collectionName.aggregate([ 
    { 
     $project: { 
      name: 1, 
      language: 1, 
      season: { 
       $filter: { 
        input: "$seasons", 
        as: "s", 
        cond: { 
         $eq: ["$$s.number", 1] 
        } 
       } 
      } 
     } 
    }, 
    { $unwind: "$season"}, 
    { $unwind: "$season.episodes"}, 
    { 
     $project: { 
      seasonEpisodeNumber: '$season.episodes.number' 
     } 
    } 
]) 

Unrecognized expression '$project'

Ihre zweite $project war in Ihrem ersten $project Aus diesem Grund wird die Fehlermeldung. Jede Pipeline ist eine Ausführung, sodass Sie keine verschachtelten Pipelines haben können. Wenn Sie zwei Projekte müssen zurück haben, dann nach hinten tun Sie es so, dass Beispiel:

{ $project: {...}}, { $project: {...}} 

und das Feld number innerhalb des Arrays ist episodes, die im Objektfeld ist seasons, so wurden Sie, dass fehlt.

Auch in Ihrem $filter ist es nicht erforderlich, ein Doppel-Array zu erstellen. Sie tun dies:

season: [{ 
     $filter: { 
     input: "$seasons", 
     as: "s", 
     cond: { $eq: [ "$$s.number", saison ] } 
     } etc... 

, die ein Array innerhalb eines Arrays erstellt. Sofern Sie das Ergebnis nicht in dieser Form erwarten, gibt es keinen Grund dafür. In meiner Antwort habe ich die geschachtelte Array-Erstellung entfernt.