従業員は単一のエンティティです。したがって、おそらくage
をモデル化する必要はありません。 部門や場所、チームの豊富な構造に深く関わっているチームメンバーの別のemployees
がいることはまったく問題ありません コレクションと単純な実行:
db.businesses.aggregate([
{$match: {"age": {$gt: 50} }}
,{$sort: {"age": -1} }
]);
businesses
の奥深く あなたが持つことができるコレクション:
{ teams: [ {name: "T1", employees: [ "E1", "E34" ]} ] }
または、これを試してください:
db.businesses.aggregate([ your pipeline] ,{allowDiskUse:true});
OPには、10 biz-> 10 loc-> 10 depts-> 10 team->100empsのセットアップがあります。最初の3つの巻き戻しは、データの10000倍の爆発を作成しますが、最後の1つはそれを100倍超えています。 $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}}])