Временные таблицы (CTE) в MongoDB

#mysql #sql #mongodb #mongodb-query #aggregation-framework

#mysql #sql #mongodb #mongodb-запрос #агрегация-фреймворк

Вопрос:

Я знаю, что общие табличные выражения (CTE), также известные как «временные именованные результирующие наборы», могут использоваться в SQL для создания временной таблицы, но можно ли это сделать в MongoDB? Мне нужен документ, но он предназначен только для временного использования в моем запросе.

Можете ли вы создать временную таблицу в MongoDB без создания новой коллекции?

Например, если бы я попытался воссоздать приведенный ниже код в Mongo…

Пример таблицы CTE в SQL:

n f1 f2
1 20 12
2 40 0.632
3 60 0.647
 WITH RECURSIVE example (n, f1, f2) AS 
( SELECT 1, 20, 12
UNION ALL  SELECT 
n   1,
n * 20, 
least(6*n, $globalVar * 100),
FROM example WHERE n < 3
) SELECT * FROM example
 

Комментарии:

1. Я знаю о $graphLookup stage, но я не думаю, что это подходит для моего варианта использования… Мне не нужно передавать коллекцию

2. Может быть, лучше разместить на дочернем сайте, DBA.StackExchange.com .

Ответ №1:

Похоже, что в MongoDB нет общего эквивалента для CTE. Однако, для примера OP, можно изменить вывод $range , чтобы получить аналогичный эффект.

 // whichever collection doesn't matter; as long as it has 1 document then it should be fine
db.collection.aggregate([
  {
    // jsut take 1 document
    "$limit": 1
  },
  {
    // use $range to generate iterator [1, 2, 3]
    "$addFields": {
      "rg": {
        "$range": [
          1,
          4
        ]
      },
      globalVar: 0.001
    }
  },
  {
    // do the mapping according to logic
    "$addFields": {
      "cte": {
        "$map": {
          "input": "$rg",
          "as": "n",
          "in": {
            n: "$n",
            f1: {
              "$multiply": [
                "$n",
                20
              ]
            },
            f2: {
              "$cond": {
                "if": {
                  $lt: [
                    {
                      "$multiply": [
                        "$n",
                        6
                      ]
                    },
                    {
                      "$multiply": [
                        "$globalVar",
                        100
                      ]
                    }
                  ]
                },
                "then": {
                  "$multiply": [
                    "$n",
                    6
                  ]
                },
                "else": {
                  "$multiply": [
                    "$globalVar",
                    100
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    // wrangle back to expected form
    "$unwind": "$cte"
  },
  {
    "$replaceRoot": {
      "newRoot": "$cte"
    }
  }
])
 

Вот игровая площадка Mongo для вашей справки.

Комментарии:

1. В чем значение $$ в $$ n? Я никогда раньше не сталкивался с двойным знаком доллара в Монго @ray

2. @cramos24 $$ обычно используется для ссылки на переменную. В нашем случае n «объявлено» как переменная для нашего $map . Вы можете ознакомиться с этим официальным документом для получения дополнительной информации