Phiên bản Mongo 3.4
Bản đồ $ để nhân giá và giá trị của mặt hàng và $ giảm để tính tổng giá và giá trị của mặt hàng và $ giảm để tính tổng giá vốn của mặt hàng. $ trừ các giá trị từ lần giảm trước đó để nhận được số tiền cuối cùng.
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"]
}
}
}]
}
}
}])
Phiên bản Mongo 3.x
Dự án $ đầu tiên để nhân giá trị và giá của mặt hàng. Việc nhóm tiếp theo để tính tổng cho cả trường mục và trường chi phí, điều này sẽ dẫn đến một giá trị mảng cho từng mục và trường chi phí và dự án cuối cùng chỉ xem xét giá trị mảng từ cả hai mảng với $ arrayElemAt để trừ các giá trị cho nhau.
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]
}]
}
}
}])
Phiên bản Mongo 2.6
$ unwind các mục và nhóm thành tổng giá trị calcualte được trả về từ việc nhân giá &giá trị của mặt hàng và $ chi phí xả hàng để tính tổng giá và giá trị của mặt hàng và dự án $ trừ các giá trị từ nhóm trước đó để tính số tiền cuối cùng.
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']
}
}
}])