2016-08-12 2 views
7

ein paar collecitons Gegeben:

1.- NUTZER

{ 
    name: ... 
    id: ... 
    city: ... 
    age: ... 
    otherdata: ... 
} 

2.- TIERE

{ 
    name: ... 
    owner: ... 
    type: ... 
    age: ... 
} 

Ich versuche Verwenden von Aggregation mit $ lookup zum Erstellen einer Gruppe von Objekten, die Benutzer mit ihren Haustieren darstellen:

Aber ich möchte einen Filter hinzufügen, so dass nur Haustiere, die älter als 1 Jahr sind, zu jedem Benutzer hinzugefügt werden (Feld Alter in den Haustier-Objekten verwenden).

Das Problem ist, Hinzufügen $ Match in der Aggregation funktioniert nicht, weil es Benutzer ohne alte Haustiere ausfiltert, und ich möchte die Benutzer, selbst wenn sie keine Haustiere haben.

Eigentlich versuche ich auch nur die ältesten der Tiere von jedem Benutzer auf die gleiche Weise zu bekommen und ich habe auch nicht die Formel gefunden.

Sie können diese Aktion innerhalb der Aggregation durchführen?

Natürlich mache ich es im nachhinein auf den zurückgegebenen Objekten.

Vielen Dank im Voraus.

Antwort

5

Sie können $filter Array Aggregation Operator auf pets Array verwenden, die von Ihrer $lookup Bühne produziert wird.

Zur Ausgabe Haustiere älter als 1 Jahr Gebrauch

db.users.aggregate([ 
{ 
    $lookup: 
    { 
    from: "pets", 
    localField: "id", 
    foreignField: "owner", 
    as: "pets" 
    } 
}, 
{ 
    $project: 
    { 
    name: 1, 
    pets: 
    { 
     $filter: 
     { 
     input: "$pets", 
     as: "pet", 
     cond: { $gte: [ "$$pet.age", 1 ] } 
     } 
    } 
    } 
} 
]); 

Zur Ausgabe ersetzen die ältesten Haustiere einfach cond Bereich der $filter Operator in der vorherigen Aggregations Pipeline mit

cond: { $eq: [ "$$pet.age", { $max: "$pets.age" } ] } 
+0

Großen Dank. Noch ein Gedanke, ich werde in mich selbst schauen, aber nur für den Fall, dass Sie schneller sind: Was ist, wenn ich nur die Anzahl der Haustiere in der "Haustiere" -Array beschränken möchte? :-) – Gabriel

+0

Schauen Sie sich den Operator [** '$ slice' **] (https://docs.mongodb.com/manual/reference/operator/aggregation/slice/#exp._S_slice) an und verwenden Sie ihn in' $ project' stage statt '$ filter'. – tarashypka

+0

Ja, ich kämpfe mit $ slice, aber ich brauche ein bisschen Sortieren, bevor ich schneide ... Ich möchte die richtigen Scheiben schneiden :-) – Gabriel