如何使用多个选择下拉列表筛选组合搜索MongoDB文档?

如何使用多个选择下拉列表筛选组合搜索MongoDB文档?,mongodb,mongodb-query,Mongodb,Mongodb Query,我在一个名为inventory的集合中有以下示例数据: { "_id" : 1, "item" : "abc1", description: "product 1", status: "Low" } { "_id" : 2, "item" : "abc2", description: "product 2", status: "Medium" } { "_id" : 3, "item" : "xyz1", description: "product 3", status: "High" } 我

我在一个名为
inventory
的集合中有以下示例数据:

{ "_id" : 1, "item" : "abc1", description: "product 1", status: "Low" }
{ "_id" : 2, "item" : "abc2", description: "product 2", status: "Medium" }
{ "_id" : 3, "item" : "xyz1", description: "product 3", status: "High" }
我还有一个屏幕,其中包含三个用于查询上述库存的选择下拉列表过滤器,即:

Item
Description
Status
在这里,用户可以选择过滤所有三个下拉列表中的数据,以获得所需的报告数据输出,也可以仅选择on Item,以过滤报告数据

我的问题是,如何根据下拉列表中的选定值执行所需的
mongodb.find
查询,该下拉列表可以是一个选择,甚至是两个选择

例如,如果用户选择以下组合并按下submit按钮,我希望只看到此文档:

Item = "abc2" selected by user
Description = no selection
Status = no selection
代码:

由于我不确定将执行哪些过滤器选择,因此我需要满足所有组合类型的要求


< >选择“<代码>项目>代码>返回0个文档,因为它同时期望代码< >描述< /代码>和<代码>状态< /代码>,但实际上应该返回一个文档。

也许在应用程序逻辑中构建这个条件更好,但是您可以考虑使用类似的方式构建MangGDB查询。下:

var query = {
    "item" : "abc2",
    "description" : "",
    "status" : ""
}

db.col.find({
    $expr: {
        $and: [
            { $cond: [ { $eq: [ query.item, "" ] }, true, { $eq: [ "$item", query.item ] } ] },
            { $cond: [ { $eq: [ query.description, "" ] }, true, { $eq: [ "$description", query.description ] } ] },
            { $cond: [ { $eq: [ query.status, "" ] }, true, { $eq: [ "$status", query.status ] } ] },
        ]
    }
})

$expr和$cond运算符是否都需要与聚合一起使用?@tonyf
$expr
允许您在
find()
中运行聚合表达式,
$cond
是其中之一,因此您需要两者
var query = {
    "item" : "abc2",
    "description" : "",
    "status" : ""
}

db.col.find({
    $expr: {
        $and: [
            { $cond: [ { $eq: [ query.item, "" ] }, true, { $eq: [ "$item", query.item ] } ] },
            { $cond: [ { $eq: [ query.description, "" ] }, true, { $eq: [ "$description", query.description ] } ] },
            { $cond: [ { $eq: [ query.status, "" ] }, true, { $eq: [ "$status", query.status ] } ] },
        ]
    }
})