Как получить доступ к атрибуту из того же этапа в монго-пиплелине? - PullRequest
1 голос
/ 07 ноября 2019
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", "$$time_interval_mins"]}, 3600]},
  },
}

Я хочу использовать time_interval_mins для различных других вычислений, подобных тому, который использовался в потребление_часов на том же этапе. хотел знать, возможно ли что-то подобное. Я видел, как работает $let, но, насколько я понимаю, мы можем вернуть только одно значение.

Я всегда могу создать новый этап после этого и использовать time_interval_mins, где бы ни требовалось, но я чувствую, что долженбыть лучшим способом сделать это, что я пропускаю.

1 Ответ

1 голос
/ 07 ноября 2019

Как вы упомянули, вам нужно использовать $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", "$$time_interval_mins"]}, 3600]}
                    }
                }
            }
        }
    }
])

Mongo Playground

Вы также можете попробовать $ replaceRoot если вам нужно продвинуть ваш объект на верхний уровень:

db.collection.aggregate([
    {
        $replaceRoot: {
            newRoot: {
                $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", "$$time_interval_mins"]}, 3600]}
                    }
                }
            }
        }
    }
])

Монго Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...