Mongo 3.4-versie
$map om de prijs en waarde van het artikel te vermenigvuldigen en $reduce om de som van de prijs en waarde van het artikel te berekenen en $reduce om de som van de kostprijs te berekenen. $trek waarden af van eerdere verlagingen om het uiteindelijke bedrag te krijgen.
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-versie
Eerste $project om de waarde en prijs van het item te vermenigvuldigen. Volgende groepering om de som voor zowel items als kostenvelden te berekenen, wat resulteert in één matrixwaarde voor elk item en kostenveld en het uiteindelijke project kijkt alleen naar de matrixwaarde van beide arrays met $arrayElemAt om de waarden van elkaar af te trekken.
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-versie
$unwind items en groep om de som van de waarden te berekenen die worden geretourneerd door de prijs en waarde van het item te vermenigvuldigen en $unwind de kosten om de som van de prijs en de waarde van het item en het project te berekenen om $waarden af te trekken van de vorige groepering om het uiteindelijke bedrag te berekenen.
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']
}
}
}])