【问题标题】:How to write switch/case condition in Mongodb $match aggregate如何在 Mongodb $match 聚合中编写 switch/case 条件
【发布时间】:2018-07-10 10:07:37
【问题描述】:

我有一个名为 Projects 的集合;在这个集合中,我有一个项目的货币字段和一个价格金额字段。

在 Express 搜索路线中,我有 2 个变量,分别称为 USDamountEURamount。我的问题是,当文件的货币为“USD”时,如何按 USDamount 搜索匹配价格的项目,当文件的货币为“EUR”时,如何按 EURamount 搜索,其他货币以此类推(这意味着我需要一个 switch/case 而不是 if/else)?

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    如果没有详细信息,您可以在聚合中使用 switch 语句 MongoDB documentation,在您的查询中它看起来像这样:

    db.getCollection("Projects").aggregate(
        [
            { $project:
                {price : 
                    {$switch: {
                       branches: [
                          { case: {$eq: ['$currency', 'USD']}, then: '$USDAmount' },
                          { case: {$eq: ['$currency', 'EUR']}, then: '$EURAmount' } ],
                       default: 0
                       }
                    }
                }
            }
        ]
    )
    

    注意:要生成包含 Currency 和 Amount 的复合对象,您可以将 (I.E. '$USDAmount') 替换为:

    {'currency': '$currency', 'amount': '$USDAmount' }
    

    请注意,我添加了默认价格 0;您可能希望在 $project 之前将 $match 运算符添加到管道中。

    more complicated example can be found here.

    【讨论】:

    • 它是否只是按价格字段过滤提交的价格或整个结果文档? (根据使用$project)
    • $project 并没有真正运行过滤器。管道中的 $project 阶段是演示阶段。如果您将 mongo 管道视为一系列函数,而不是单个 SQL 查询,则更有意义。 $project 运算符对输入的内容进行处理。这只是提出一个价格;如果需要,您可以在各种情况下返回复合字段,并且可以返回不依赖于情况的其他字段。
    • 它可以工作,但要得到我们想要的,我们需要通过在管道末尾添加 $match 来过滤 $project 结果。谢谢你,迪伦。
    • 出于性能原因,通常最好在投影之前添加 match 语句。缩小受投影影响​​的文档数量意味着在匹配期间处理的数据更少。
    • 实际上,我使用项目的字段结果再次$matching结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2019-04-20
    • 2015-12-28
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多