【发布时间】:2021-08-31 02:56:51
【问题描述】:
我在 Web 应用程序的前端有过滤器,其中大部分是多选过滤器。
我正在尝试编写一个处理两种场景的 mongo 聚合查询。
- 用户从多选下拉过滤器中选择值。查询将获取这些选定的值并将相关数据返回给客户端。
- 用户未从多选中选择任何内容 下拉过滤器。在这种情况下,查询应该返回所有数据。
查询应该如下所示。显然,下面的查询不起作用。
db.hospitals.aggregate([
{
$match: {
hosp_name: {
$cond: {
if: {
$in: [""]
}, then: "*", else: $in: ["ABC Hospital", "DEF Hospitals"] }
}
}
}
},
{
$group: {
_id: {
"IP/OP": "$ip_op"
}
}
}
])
在这里,在条件块中,我试图传达以下含义:
- 如果用户未在医院名称多选下拉过滤器中选择任何值,则显示所有医院的 IP/OP 记录。
- 但是,如果用户从多选下拉菜单中选择医院名称,则会显示所选医院的 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