2017-11-12 7 views
1

Iを別々にうまく機能する2つのMongoの集計クエリがある - 最初のクエリは、ドキュメント、{ "to_count" のトップレベル要素の集計データを返すトップレベル要素と1レベル下位配列要素を1つのmongoクエリで集計する方法は?

db.transfer_orders.aggregate([ 
    { 
     $match: { 
      "request_timestamp": { $gte: ISODate("2017-10-00T00:00:00.000Z") }, 
      "request_timestamp": { $lt: ISODate("2017-10-12T00:00:00.000Z") }, 
      "purpose": "POSITIONING" 
     } 
    }, 
    { 
     $group: { 
      _id: null, 
      to_count: { $sum: 1 }, 
      qty: { $sum: "$quantity" } 
     } 
    }, 
    { 
    $project: { 
     _id: 0, 
     "to_count": "$to_count", 
     "qty": "$qty" 
    } 
    } 
]) 

db.transfer_orders.aggregate([ 
    { 
    $match: { 
      "request_timestamp": { $gte: ISODate("2017-10-00T00:00:00.000Z") }, 
      "request_timestamp": { $lt: ISODate("2017-10-12T00:00:00.000Z") }, 
      "purpose": "POSITIONING" 
     } 
    }, 
    { 
    $unwind: "$adjustments" 
    }, 
    { 
    $group: { 
     _id: null, 
     totalChangeQty: { $sum: "$adjustments.change_in_quantity"} 
    } 
    }, 
    { 
    $project: { 
     _id: 0, 
     "adjusted_quantity": "$totalChangeQty" 
    } 
    } 
]) 

を:7810 、 "qty":19470}

第2のクエリは、「調整」配列の最上位の1レベル下の要素の集計データを返します。{「adjusted_quantity」:-960}

これを両方のデータセットを返す1つのクエリとして記述する方法はありますか?

答えて

1

それは新しいフィールドadjusted_quantityを紹介し$match工程の後にパイプラインを持っているので、次の集計操作で十分です。これは、$sumを使用して可能になります。これは、各ドキュメントの指定された式リストの合計を返します。

それは$group段階に達すると、あなたは$sum演算子を使用して値を保持することができます。

db.transfer_orders.aggregate([ 
    { 
     "$match": { 
      "request_timestamp": { "$gte": ISODate("2017-10-00T00:00:00.000Z") }, 
      "request_timestamp": { "$lt": ISODate("2017-10-12T00:00:00.000Z") }, 
      "purpose": "POSITIONING" 
     } 
    }, 
    { 
     "$addFields": { 
      "adjusted_quantity": { 
       "$sum": "$adjustments.change_in_quantity" 
      }  
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "to_count": { "$sum": 1 }, 
      "qty": { "$sum": "$quantity" }, 
      "adjusted_quantity": { "$sum": "$adjusted_quantity" } 
     } 
    } 
]) 
+0

Iは、上記のクエリを実行すると、私はこの結果を得る - { "_id":ヌル、 "to_count":7810、 "数量":19470、 "adjusted_quantity":0} – rmulay

+0

chridam - "調整" とは、あります【 \t \t { \t \t \t "adjustment_id": "113179"、 \t \t \t "new_quantity":0、 \t \t \t "change_in_quantity":-1 '\t "調整" - このような要素を含む配列、 \t \t \t "CREATED_BY": "WMS"、 \t \t \t "EVENT_TIMESTAMP":ISODate( "2017-10-11T06:05:48.459Z")、 \t \t \t "request_timestamp":ISODate( "2017から10 -11T06:05:48.459Z ")、 \t \t \t "sent_to_move_topic"、真 \t \t \t "send_attempt_timestamp":ISODate(" 2017-10-11T06:05:48.459Z」) \t \t} \t] ' なので、 "$ sum"とは思えません。 "$ adjustments.change_in_quantity"は$ unwindを使わないで配列の要素を合計できますか? – rmulay

+1

最後の '' $ first ''を' '$ sum" 'で置き換えると動作します。 – dnickless

関連する問題