如何在mongoDB中使用aggregate获得此结果

时间:2016-11-21 23:18:51

标签: mongodb mongodb-query aggregation-framework

我有发票收藏......

{
"_id" : 1,
"items" : [ 
    {
        "_id" : 1,
        "value" : 100,
        "price" : 9500
    }, 
    {
        "_id" : 2,
        "value" : 200,
        "price" : 9500
    }
],
"costs" : [ 
    {
        "_id" : 1,
        "price" : 100
    }, 
    {
        "_id" : 2,
        "price" : 150
    }, 
    {
        "_id" : 3,
        "price" : 250
    }
]}

我通过汇总获得发票金额......

换句话说=>

{$ sum:{$ multiply:{[$ items.value,$ items.price]}}} - {$ sum:“$ costs.price”};

{
  "_id" : 1,
  "amount" : 2849500
}

非常想......

;-)

1 个答案:

答案 0 :(得分:3)

Mongo 3.4版本

$ map乘以商品的价格& value和$ reduce来计算商品价格和的总和。 value和$ reduce来计算成本价格的总和。 $减去早期减少的值以获得最终金额。

aggregate([{
    $project: {
        _id: 1,
        amount: {
            $subtract: [{
                $reduce: {
                    input: {
                        $map: {
                            input: "$items",
                            as: "item",
                            in: {
                                $multiply: ["$$item.value", "$$item.price"]
                            }
                        }
                    },
                    initialValue: 0,
                    in: {
                        $add: ["$$value", "$$this"]
                    }
                }
            }, {
                $reduce: {
                    input: "$costs.price",
                    initialValue: 0,
                    in: {
                        $add: ["$$value", "$$this"]
                    }
                }
            }]
        }

    }
}])

Mongo 3.x版本

第一个$项目乘以项目的价值&价钱。接下来分组以计算项目和成本字段的总和,这将导致每个项目和成本字段和最终项目的一个数组值仅查看来自两个数组的数组值,并使用$ arrayElemAt从彼此中减去值。

aggregate(
    [{
        $project: {
            vpItems: {
                $map: {
                    input: "$items",
                    as: "item",
                    in: {
                        $multiply: ["$$item.value", "$$item.price"]
                    }
                }
            },
            costs: '$costs'
        }
    }, {
        $group: {
            _id: '$_id',
            vpItems: {
                $addToSet: {
                    $sum: '$vpItems'
                }
            },
            pCosts: {
                $addToSet: {
                    $sum: '$costs.price'
                }
            }
        }
    }, {
        $project: {
            _id: 1,
            amount: {
                $subtract: [{
                    $arrayElemAt: ["$vpItems", 0]
                }, {
                    $arrayElemAt: ["$pCosts", 0]
                }]
            }
        }
    }])

Mongo 2.6版本

$展开项目和分组以计算从项目的价格乘以所返回的值的总和&价值和$展开成本来计算商品价格和的总和。值和项目为$减去先前分组的值以计算最终金额。

aggregate([{
      $unwind: '$items'
  }, {
      $group: {
          _id: '$_id',
          totalItems: {
              $sum: {
                  $multiply: ["$items.value", "$items.price"]
              }
          },
          costs: {
              $first: '$costs'
          }
      }
  }, {
      $unwind: '$costs'
  }, {
      $group: {
          _id: '$_id',
          totalItems: {
              $first: '$totalItems'
          },
          totalPrice: {
              $sum: '$costs.price'
          }
      }
  }, {
      $project: {
          _id: 1,
          amount: {
              $subtract: ['$totalItems', '$totalPrice']
          }
      }
  }])