Versi Mongo 3.4
$map untuk mengalikan harga &nilai item dan $reduce untuk menghitung jumlah harga &nilai item dan $reduce untuk menghitung jumlah harga biaya. $kurangi nilai dari pengurangan sebelumnya untuk mendapatkan jumlah akhir.
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"]
}
}
}]
}
}
}])
Versi Mongo 3.x
$proyek pertama untuk mengalikan nilai &harga item. Pengelompokan berikutnya untuk menghitung jumlah untuk bidang item dan biaya, yang akan menghasilkan satu nilai larik untuk setiap bidang item dan biaya dan tugas akhir hanya melihat nilai larik dari kedua larik dengan $arrayElemAt untuk mengurangi nilai satu sama lain.
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]
}]
}
}
}])
Versi Mongo 2.6
$unwind item dan grup untuk menghitung jumlah nilai yang dikembalikan dari mengalikan harga &nilai item dan $unwind biaya untuk menghitung jumlah harga &nilai item dan proyeksikan ke $kurangi nilai dari pengelompokan sebelumnya untuk menghitung jumlah akhir.
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']
}
}
}])