Version Mongo 3.4
$map pour multiplier le prix et la valeur de l'article et $reduce pour calculer la somme du prix et de la valeur de l'article et $reduce pour calculer la somme du prix de revient. $soustrayez les valeurs de la réduction précédente pour obtenir le montant final.
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"]
}
}
}]
}
}
}])
Version Mongo 3.x
Premier $project à multiplier la valeur et le prix de l'article. Regroupement suivant pour calculer la somme des champs d'articles et de coûts, ce qui se traduira par une valeur de tableau pour chaque champ d'article et de coût et le projet final ne regarde que la valeur de tableau des deux tableaux avec $arrayElemAt pour soustraire les valeurs les unes des autres.
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]
}]
}
}
}])
Version Mongo 2.6
$déroulez les articles et groupez pour calculer la somme des valeurs renvoyées en multipliant le prix et la valeur de l'article et $déroulez les coûts pour calculer la somme du prix et de la valeur de l'article et projetez pour $soustraire les valeurs du regroupement précédent pour calculer le montant final.
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']
}
}
}])