【问题标题】:How to create a computed field using another computed field in a Mongoose projection?如何在 Mongoose 投影中使用另一个计算域创建一个计算域?
【发布时间】:2020-09-23 18:27:36
【问题描述】:

考虑具有以下属性的架构:

{
  maxDmg: Number,
  attacks: Number
}

我需要创建一个计算域,其中包含另一个计算域的结果,例如:

$project {
  maxDmg: true,
  attacks: true,
  effDmg: { $multiply: ["$maxDmg", 0.70] },
  dps: { $divide: [ {$multiply:["$effDmg","$attacks"]}, 60 ] }
}

但看起来计算列“effDmg”不能在另一个计算列中引用。有解决办法吗?

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    我认为您不能访问现有的计算变量,但您可以使用 let 运算符创建相同的计算变量并在另一个计算变量中使用。希望这会有所帮助。

    $project: {
        maxDmg: true,
        attacks: true,
        effDmg: {
            $multiply: ["$maxDmg", 0.70]
        },
        dps: {
            $let: {
                vars: {
                    effDmg: {
                        $multiply: ["$maxDmg", 0.70]
                    }
                },
                in: {
                    $divide: [{
                        $multiply: ["$$effDmg", "$attacks"]
                    }, 60]
                }
            }
        }
    }
    

    更新

    您可以将计算保留在一个项目中,然后您可以将它们投影出来。这样至少你最终会重用变量。

    $project: {
        maxDmg: true,
        attacks: true,
        together: {
            $let: {
                vars: {
                    effDmg: {
                        $multiply: ["$maxDmg", 0.70]
                    }
                },
                in: {
                    dps: {
                        $divide: [{
                            $multiply: ["$$effDmg", "$attacks"]
                        }, 60]
                    },
                    effDmg: "$$effDmg"
                }
            }
        }
    }
    

    样本输出:

    {
        "maxDmg": 34,
        "attacks": 45,
        "together": {
            "dps": 17.849999999999998,
            "effDmg": 23.799999999999997
        }
    }
    

    【讨论】:

    • 人力资源部。不是我希望的答案,因为计算实际上比我在示例中使用的复杂得多,我想避免代码重复。尽管如此,还是学到了一些新东西,所以谢谢!
    • 已更新。看看是否有帮助。您可以添加另一个项目来提取值。
    • 哦,是的,好点;我经常忽略显而易见的事情。这对我有用,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多