MongoDB $ внутри $ cond - PullRequest
0 голосов
/ 16 марта 2019

Я сжег свой мозг, пытаясь сгруппировать и посчитать итены в MongoDB. Есть много постов, но никто не в том, что мне нужно.

Это пример, основанный на: ответ стивана

db.VIEW_HISTORICO.aggregate([

{ 
    $match: { PartnerId: "2021", DT_RECEBIDO: {$gte: "2019-03-10 00:00:00", $lte: "2019-03-12 23:59:59"}}   
},

{ 
    $group: { _id: null,

            Controle1: { $sum: {$cond: [{ $gt: ['$CD_EVENTO', 0]}, 1, 0]}},
            Controle2: { $sum: {$cond: [{ $lt: ['$CD_EVENTO', 0]}, 1, 0]}}

            }
}

])

Мне нужно сгруппировать по $ in и $ match вместе, получая более одного результата.

РАБОТАЕТ ОДИН РЕЗУЛЬТАТ

db.VIEW_HISTORICO.aggregate([

{ 
    $match: { PartnerId: "2021", DT_RECEBIDO: {$gte: "2019-03-10 00:00:00", $lte: "2019-03-12 23:59:59"}, "CD_EVENTO": { $in: ["K127", "9027"] }, }   
},

{
    $count : "Controles"
}

])

Используя MSSQL, я получил наилучшие результаты:

SELECT 
            SUM(CASE WHEN CD_EVENTO = 'K102' THEN 1 ELSE 0 END) AS Interfone,
            SUM(CASE WHEN CD_EVENTO IN('9015', '9016', '9017', '9018', '9019', '9020', '9021', '9022', '9023', '9024', '9025', '9026', 'K154', 'K155') THEN 1 ELSE 0 END) AS Tag,
            SUM(CASE WHEN CD_EVENTO IN('9027', '9028', '9029', '9030', '9031', '9032', '9033', '9034', 'K127') THEN 1 ELSE 0 END) AS Controle,
            SUM(CASE WHEN CD_EVENTO IN('K203', 'K204') THEN 1 ELSE 0 END) AS QrCode,
            SUM(CASE WHEN CD_EVENTO IN('K183', 'K184') THEN 1 ELSE 0 END) AS Convite
            FROM VIEW_ANALYTICS
            WHERE DT_RECEBIDO BETWEEN GETDATE()-30 AND GETDATE()

Я очень старался, но не смог перевести мой MSSQL на MongoDB. Мой запрос.

db.VIEW_HISTORICO.aggregate([

{ 
    $match: { PartnerId: "2021", DT_RECEBIDO: {$gte: "2019-03-10 00:00:00", $lte: "2019-03-12 23:59:59"}}   
},

{ 
    $group: { _id: null,

            Controle1: { $sum: {$cond: [{ "CD_EVENTO": { $in: ["K127", "9027"] }}, 1, 0]}},


            Controle2: { $sum: {$cond: [{ "CD_EVENTO": { $in: ["K154", "K155"] }}, 1, 0]}}

            }
}

])

1 Ответ

1 голос
/ 17 марта 2019

Синтаксис для оператора $ в немного отличается от того, что вы пытаетесь сделать здесь.Он принимает массив из двух элементов: первый представляет ссылку на поле (должен начинаться со знака доллара), а второй - массив значений, поэтому ваш этап $group должен выглядеть следующим образом:

db.VIEW_HISTORICO.aggregate([
    { 
        $group: { _id: null,
                Controle1: { $sum: {$cond: [{ $in: ["$CD_EVENTO", ["K127", "9027"]]}, 1, 0]}},
                Controle2: { $sum: {$cond: [{ $in: ["$CD_EVENTO", ["K154", "K155"]]}, 1, 0]}},
                }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...