От MySQL до Mongoose: совокупный документ с максимальным умножением двух значений во всех строках - PullRequest
0 голосов
/ 10 ноября 2018

Для данной таблицы:

id | val_a | val_b | mult | category
------------------------------------
 0 | 1     | 2     | 9    | A
 1 | 0     | 3     | 5    | B
 2 | 0.5   | 4     | 6    | C

следующий запрос в MySQL

SELECT * FROM table WHERE category IN ('A','B','C') 
AND IF( val_a > 0, val_a, val_b ) * mult = (SELECT MAX( IF( val_a > 0, val_a, val_b ) * mult ) FROM table WHERE category IN ('A','B','C')) LIMIT 1;

найдет умножения val_a * mult для каждой строки (если val_a == 0: val_b * mult )

0) 1*9 = 9
1) 3*5 = 15
2) 0.5*4 = 2

, затем найдите максимум всех ответов и, наконец, верните строку с идентификатором: 1

1) 15

Как мне собрать то же самое в Mongoose? Даже частичный ответ поможет двигаться вперед и учиться. Пытался начать с http://www.querymongo.com/, но безуспешно.

1 Ответ

0 голосов
/ 11 ноября 2018

Вы можете использовать $ match с $ in для применения условия фильтрации, а затем $ multiply с $ cond для вычисления значения на основе вашей формулы. Наконец, вы можете добавить $ sort с $ limit , чтобы получить значение MAX. Попробуйте:

db.col.aggregate([
    {
        $match: {
            category: { $in: [ "A", "B", "C" ] }
        }
    },
    {
        $project: {
            _id: 1,
            value: {
                $multiply: [ { $cond: [ { $ne: [ "$val_a", 0 ] }, "$val_a", "$val_b" ] }, "$mult" ]
            }
        }
    },
    {
        $sort: { value: -1 }
    },
    {
        $limit: 1
    }
])

Выходы:

{ "_id" : 1, "value" : 15 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...