【问题标题】:MongoDB $in inside $condMongoDB $in 内 $cond
【发布时间】:2019-08-07 15:14:09
【问题描述】:

我试图在 MongoDB 中对元素进行分组和计数,这让我的大脑筋疲力尽。有很多帖子,但没有一个是我需要的。

这是一个基于以下内容的示例: styvane answer

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]}}

            }
}

])

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    $in 运算符的语法与您在此处尝试执行的操作有些不同。它需要一个包含两个元素的数组:第一个表示对字段的引用(必须以美元符号开头),第二个是值数组,因此您的 $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]}},
                    }
        }
    ])
    

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 2014-07-19
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2016-05-30
      相关资源
      最近更新 更多