Mongo3.4バージョン
$ mapはアイテムの価格と価値を乗算し、$ reduceはアイテムの価格と価値の合計を計算し、$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"]
}
}
}]
}
}
}])
Mongo3.xバージョン
アイテムの価値と価格を増やす最初の$project。次に、アイテムとコストの両方のフィールドの合計を計算するためのグループ化。これにより、アイテムとコストのフィールドごとに1つの配列値が生成され、最終的なプロジェクトでは、$ 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]
}]
}
}
}])
Mongo2.6バージョン
$ unwindアイテムとグループ化して返された値の合計を計算するには、アイテムの価格と値を乗算し、$ unwindコストを使用してアイテムの価格と値の合計を計算し、前のグループ化から$減算して最終的な金額を計算します。
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']
}
}
}])