Mitarbeiter sind einzelne Einheiten; daher möchten Sie age
wahrscheinlich nicht modellieren eines Teammitglieds so tief in der reichen Struktur von Abteilungen und Standorten und Teams. Es ist völlig in Ordnung, separate employees
zu haben Sammlung und tun Sie einfach:
db.businesses.aggregate([
{$match: {"age": {$gt: 50} }}
,{$sort: {"age": -1} }
]);
Tief in Ihren businesses
Sammlung, die Sie haben können:
{ teams: [ {name: "T1", employees: [ "E1", "E34" ]} ] }
Versuchen Sie alternativ Folgendes:
db.businesses.aggregate([ your pipeline] ,{allowDiskUse:true});
Das OP hat ein Setup von 10 Biz -> 10 Loc -> 10 Depts -> 10 Teams -> 100 Emps. Die ersten 3 Abwicklungen erzeugen eine 10000-fache Datenexplosion, aber die letzte geht um das 100-fache darüber hinaus. Wir können den Treffer verkleinern, indem wir $filter
verwenden :
db.businesses.aggregate([
{ $unwind: "$locations" },
{ $unwind: "$locations.departments" },
{ $unwind: "$locations.departments.teams" },
{$project: {
XX: {$filter: {
input: "$locations.departments.teams.employees",
as: "z",
cond: {$gte: [ "$$z.age", 50] }
}}
}}
,{$unwind: "$XX"}
,{$sort: {"XX.age":-1}}])