如何从mongo pipleline的同一阶段访问属性?

stage2 = {
  "$project": {
    "time_interval_mins": {"$divide": [{"$subtract": ["$to","$from"]},60000]},"consumption_hourly": {"$multiply": [{"$divide": ["$properties.consumption","$$time_interval_mins"]},60]},"calculation2": {"$multiply": [{"$divide": ["$properties.consumption",3600]},},}

我想将time_interval_mins用于其他各种计算,例如同一阶段的umption_hourly中使用的计算。想知道这样的事情是否可能。我已经了解了$let的工作原理,但是据我了解,我们只能返回一个值。

在此之后,我总是可以创建一个新舞台,并在需要时使用time_interval_mins,但是我认为必须有一种更好的方法来实现这一目标,而我会丢失。

y563346382 回答:如何从mongo pipleline的同一阶段访问属性?

就像您提到的那样,如果要在一个管道阶段使用它,则需要使用$addFields$let$let可以返回如下对象:

db.collection.aggregate([
    {
        $project: {
            result: {
                $let: {
                    vars: { "time_interval_mins": {"$divide": [{"$subtract": ["$to","$from"]},60000]} },in: {
                        time_interval_mins: "$$time_interval_mins",consumption_hourly: {"$multiply": [{"$divide": ["$properties.consumption","$$time_interval_mins"]},60]},calculation2: {"$multiply": [{"$divide": ["$properties.consumption",3600]}
                    }
                }
            }
        }
    }
])

Mongo Playground

如果您需要将对象提升到顶层,也可以尝试$replaceRoot

db.collection.aggregate([
    {
        $replaceRoot: {
            newRoot: {
                $let: {
                    vars: { "time_interval_mins": {"$divide": [{"$subtract": ["$to",3600]}
                    }
                }
            }
        }
    }
])

Mongo Playground

本文链接:https://www.f2er.com/3145837.html

大家都在问