MongoDB 获取我在项目管道中修改的字段总和

MongoDB get sum of fields which I have modified in the project pipeline

我想计算 avgAmount 作为 3 个字段的总和 = [balanceLoaded + operatorDueAmount - walletUsage]。 但这些字段可以为零或本身(balanceLoaded、operatorDueAmount、walletUsage),具体取决于条件。我想总结应用条件后计算出的最终值。是的,我需要从其他字段中减去 walletUsage。有人可以指导我如何在不更改项目管道中的字段名称的情况下执行此操作吗?

const result = await Bus.aggregate(
    [
        {
            $match: { ...filter },
        },
        {
            $project: {
                _id: 1,
                Amount1: '$Amount1',
                Amount2: { $cond: [{ $in: ['example1', dueFieldsConfigs] }, '$Amount2', 0] },
                Amount3: { $cond: [{ $in: ['example2', dueFieldsConfigs] }, '$Amount3', 0] },
                Amount4: { $cond: [{ $in: ['example3', dueFieldsConfigs] }, '$Amount4', 0] },
                avgAmount: { $sum: ['$Amount1', '$Amount2', '$Amount3'] },
            },
        },
        { $sort: sort },
        { $skip: skip },
        { $limit: limit },
    ],
);

您不能在创建它们时引用相同的字段名称,最简单的方法是在初始 $project 阶段之后添加另一个阶段:

const result = await BusDayWise.aggregate(
    [
        {
            $match: {...filter}
        },
        {
            $project: {
                _id: 1,
                fromDate: "$fromDate",
                busNumber: "$busNumber",
                cardDueAmount: "$cardDueAmount",
                walletUsage: { $cond: [ {$in: ["digital", dueFieldsConfigs] }, "$walletUsage", 0 ]},
                balanceLoaded: { $cond: [ { $in: ["moneyLoaded", dueFieldsConfigs] }, "$balanceLoaded", 0] },
                operatorDueAmount: { $cond: [ { $in: ["contractual", dueFieldsConfigs] }, "$operatorPayout", 0] },
            }
        },
        {
            $addFields: {
                netDueAmount: { $sum: ["$balanceLoaded", "$operatorDueAmount", "$walletUsage"] },
            }
        },
        { $sort: sort },
        { $skip: skip },
        { $limit: limit },
    ]
)

如果出于任何原因你想把它放在同一个阶段,你将不得不使用相同的条件来“计算”它们:

const result = await BusDayWise.aggregate(
    [
        {
            $match: { ...filter },
        },
        {
            $project: {
                _id: 1,
                fromDate: '$fromDate',
                busNumber: '$busNumber',
                cardDueAmount: '$cardDueAmount',
                walletUsage: { $cond: [{ $in: ['digital', dueFieldsConfigs] }, '$walletUsage', 0] },
                balanceLoaded: { $cond: [{ $in: ['moneyLoaded', dueFieldsConfigs] }, '$balanceLoaded', 0] },
                operatorDueAmount: { $cond: [{ $in: ['contractual', dueFieldsConfigs] }, '$operatorPayout', 0] },
                netDueAmount: {
                    $sum: [
                        { $cond: [{ $in: ['digital', dueFieldsConfigs] }, '$walletUsage', 0] },
                        { $cond: [{ $in: ['moneyLoaded', dueFieldsConfigs] }, '$balanceLoaded', 0] },
                        { $cond: [{ $in: ['contractual', dueFieldsConfigs] }, '$operatorPayout', 0] },
                    ],
                },
            },
        },
        { $sort: sort },
        { $skip: skip },
        { $limit: limit },
    ],
);