#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? Я никогда раньше не сталкивался с двойным знаком доллара в Монго @ray2. @cramos24 $$ обычно используется для ссылки на переменную. В нашем случае n «объявлено» как переменная для нашего
$map
. Вы можете ознакомиться с этим официальным документом для получения дополнительной информации