2017-10-14 4 views
0

私は何かに悩まされており、あなたの助けが必要です。 以下のコレクションでmongo集約クエリを実行して、boxWeight1とboxWeight2の各サブアレイリストのMax of Sum of totalを取得できるようにします。つまり、sum+=max[boxWeight1,boxWeight2] for each array item in boxList arrayであり、他のフィールドはそれぞれ別のKeyで投影する必要があります名前。私はあなたが私の質問を理解している願っていますMongo In各配列要素の最大値を求めた後に

{ 
    'User Mail': '[email protected]', 
    'Order Number': '12345', 
    'Total Weight': '14.0' // 4 + 8 + 2 
} 

コレクションだから、クエリを実行した後に上記のコレクションの結果は多少このようにする必要があり...多少このよう

{ 
    _id: '', 
    email: '[email protected]', 
    number: 12345, 
    boxDetail: { 
     boxname: 'package_yugal', 
     boxList: [ 
      { 
       boxWeight1: '4.0', //this is max here. so it will be added 
       boxWeight2: '2.0' 
      }. 
      { 
       boxWeight1: '4.0', 
       boxWeight2: '8.0'  //this is max here. so it will be added 
      } 
      { 
       boxWeight1: '0.0', 
       boxWeight2: '2.0'  //this is max here. so it will be added 
      } 
     ] 
    } 
} 

です。 ありがとうございます。

答えて

0

あなたは以下のクエリを試してくださいすることができ:

db.collection.aggregate([ 
      { 
       $unwind : "$boxList" 
      }, 
      { 
       $project : { 
          "email" : 1, 
          "number" : 1, 
          "maxWeight" : { $cond : { if : { $gt : 
           ["$boxList.boxWeight1","$boxList.boxWeight2"]} , 
                then : "$boxList.boxWeight1" , 
                else : "$boxList.boxWeight2"} 
             } 
         } 
      }, 
      { 
       $group : { 
          _id : "$_id" , 
          Total : { $sum : "$maxWeight" }, 
          email : { $first : "$email" }, 
          number : {$first : "$number"} 
         } 
      }, 
      { 
       $project : { 
          "User Mail" : "$email" , 
          "Order Number" : "$number", 
          "Total Weight" : "$Total", 
          _id : 0 
          } 
      } 
    ]); 
+0

ええ、私はこれだけのように試しました。私は上記の私の答えを掲載しました。 お返事ありがとうございます。今私は質問が正しい方向にあると確信しています。 –

0

まあ、これは働いていた...

db.collection.aggregate([ 
{ 
    $project: { 
     email: '$email', 
     number: '$number', 
     boxList: '$boxDetail.boxList' 
    }, 
    { $unwind: '$boxList' }, 
    { 
     $group: { 
      _id: '$_id', 
      'Total Weight': { 
       $sum:{ 
         $max:['$boxdetail.BoxActualWeight', '$boxdetail.BoxDimWeight'] 
        } 
       }, 
       'User Email': { 
       $first: '$email' 
       }, 
       'Order Number':{ 
       $first: '$number' 
       } 
     } 

    } 
}]) 

をこれと_id列となり与えます。それは後に別の投影で取り除くことができます。

0

最新の3.4バージョンで達成するために演算子の組み合わせを使用することができます。

以下のクエリは、max要素のリストを合計します。

$objectToArray + $max配列ビュー(kとvペアの配列)に変換し、各要素の最大値を指定します。

$map最大値のリストを出力するには、最大値の合計を$sumとします。あなただけの二つの属性を持っている場合は、以下に簡略化することができ

{ 
    "$addFields": { 
    "Total_Weight": { 
     "$sum": { 
     "$map": { 
      "input": "$boxList", 
      "in": { 
      "$let": { 
       "vars": { 
       "weigh": { 
        "$objectToArray": "$$this" 
       } 
       }, 
       "in": { 
       "$max": "$$weight.v" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

よう

何か。

{ 
    "$addFields": { 
    "Total_Weight": { 
     "$sum": { 
     "$map": { 
      "input": "$boxList", 
      "as": "result", 
      "in": { 
      "$max": [ 
       "$$result.boxWeight1", 
       "$$result.boxWeight2" 
      ] 
      } 
     } 
     } 
    } 
    } 
} 
関連する問題