【问题标题】:MongoDB query with multi-select filter with no selection scenario带有多选过滤器的 MongoDB 查询,没有选择场景
【发布时间】:2021-08-31 02:56:51
【问题描述】:

我在 Web 应用程序的前端有过滤器,其中大部分是多选过滤器。

我正在尝试编写一个处理两种场景的 mongo 聚合查询。

  1. 用户从多选下拉过滤器中选择值。查询将获取这些选定的值并将相关数据返回给客户端。
  2. 用户未从多选中选择任何内容 下拉过滤器。在这种情况下,查询应该返回所有数据。

查询应该如下所示。显然,下面的查询不起作用。

db.hospitals.aggregate([
    {
        $match: {
            hosp_name: {
                $cond: {
                    if: {
                        $in: [""]
                    }, then: "*", else: $in: ["ABC Hospital", "DEF Hospitals"] }
                }
            }
        }
    },
    {
        $group: {
            _id: {
                "IP/OP": "$ip_op"
            }
        }
    }
])

在这里,在条件块中,我试图传达以下含义:

  1. 如果用户未在医院名称多选下拉过滤器中选择任何值,则显示所有医院的 IP/OP 记录。
  2. 但是,如果用户从多选下拉菜单中选择医院名称,则会显示所选医院的 IP/OP 记录。

如何正确构造这个查询?


编辑:

我也尝试过$or 条件。虽然它正在工作,但它显示无选择场景的空结果。结果不适合我的情况。我知道我错过了什么。

db.hospital_baseline.aggregate([
    {
        $match: {
            $or: [{hospital_name: {$in: [""]}}, {hospital_name: {$in: ["ABC Hospital"]}}]
        }
    },
    {
        $group: {
            _id: {
                "Manufacturer Name": "$manufacturer_name"
            }
        }
    }
])

【问题讨论】:

  • 您可以在$match 阶段使用$expr,但您使用的方式显然不正确 - 请参阅 MongoDB 手册。
  • 我已按照 mongo 手册中的说明尝试了该模型。我没有得到预期的结果。更新了 EDIT 部分中的查询。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

我认为您需要在代码中以编程方式构建查询,首先检查选择数组:

  • 如果它是空的,那么你的聚合将只是 $group 阶段,没有任何匹配条件
  • 如果不为空,则表示有选择,那么您的聚合将是所选项目的 $match 阶段和 $group 阶段。

【讨论】:

  • 我们不能在查询级别这样做吗?
  • 也许你可以找到一种方法来实现这一点,但我相信最好让查询尽可能简单,更好地进行索引匹配,以及用于以后的调试。
  • 嗨……您有在查询中实现这一目标的示例或模板吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 2015-08-19
  • 2020-10-09
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多