如何使用多个选择下拉列表筛选组合搜索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 ] } ] },
]
}
})