Pracownicy to pojedyncze podmioty; dlatego prawdopodobnie nie chcesz modelować age
członka zespołu tak głęboko w bogatej strukturze działów, lokalizacji i zespołów. Dobrze jest mieć oddzielnych employees
odbiór i po prostu wykonaj:
db.businesses.aggregate([
{$match: {"age": {$gt: 50} }}
,{$sort: {"age": -1} }
]);
Głęboko w swoich businesses
kolekcja, którą możesz mieć:
{ teams: [ {name: "T1", employees: [ "E1", "E34" ]} ] }
Możesz też spróbować tego:
db.businesses.aggregate([ your pipeline] ,{allowDiskUse:true});
OP ma konfigurację 10 biz -> 10 lokalizacji -> 10 działów -> 10 drużyn -> 100 emps. Pierwsze 3 odwinięcia tworzą 10000-krotną eksplozję danych, ale ostatnia jest 100-krotnie większa. Możemy zmniejszyć trafienie za pomocą $filter
:
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}}])