Les employés sont des entités uniques ; ainsi, vous ne voulez probablement pas modéliser age
d'un membre de l'équipe si profondément dans la riche structure des départements, des sites et des équipes. C'est parfaitement bien d'avoir un employees
séparé collection et faites simplement :
db.businesses.aggregate([
{$match: {"age": {$gt: 50} }}
,{$sort: {"age": -1} }
]);
Au plus profond de vos businesses
collection que vous pouvez avoir :
{ teams: [ {name: "T1", employees: [ "E1", "E34" ]} ] }
Sinon, essayez ceci :
db.businesses.aggregate([ your pipeline] ,{allowDiskUse:true});
L'OP a une configuration de 10 biz -> 10 loc -> 10 départements -> 10 équipes -> 100 emps. Les 3 premiers déroulements créent une explosion de données de 10 000x, mais le dernier est 100x au-delà. Nous pouvons réduire le hit en utilisant $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}}])