2017-11-19 7 views
0

私は2つのコレクションを持っている:Mongooseでは、配列内の参照を集約する方法は?

ピープルコレクション:

{ 
    _id: ObjectId, 
    name: String, 
    employments: [ 
     { 
     start: Date, 
     end: Date 
     } 
    ] 
} 

営業時間コレクション:私は新しい分野にそれぞれにtotalHrsを作成することができますどのように私のマングース/エクスプレスコントローラで

{ 
    _id: ObjectId, 
    people: ObjectId, 
    workDate: Date, 
    workHours: Number 
} 

、雇用はfindByIdで返されます。時間の合計はどこですか?workDateは雇用の開始から終了までの間ですか?例えば次のようなものです:

答えて

0

いくつかの研究と学習の後、私はそれを自分で解決しました。

db.people.aggregate([ 
    { 
     $lookup: { 
      from:"hours", 
      localField:"_id", 
      foreignField:"people", 
      as:"hours" 
     } 
    }, 

    { 
     $unwind:"$hours" 
    }, 
    { 
     $addFields: { 
      isInRange: {$and: [ 
       {$lt: ["$employments.start", "$hours.workDate"]}, 
       {$gte: ["$employments.end", "$hours.workDate"]}, 
       ] 
      } 
     } 
    },  
    { 
     $match: {"isInRange":true}, 
    }, 
    { 
     $group: { 
      _id: "$_id", 
      name: {$first: "$name"}, 
      totalHours: {$sum: "$hours.workHours"}, 
     } 
    } 

]); 

私はそれをやりました