如何在mongodb中生成处理空过滤器的查询?

时间:2016-07-16 11:38:21

标签: sql mongodb mongodb-query database nosql

我知道这个问题不够清楚 我将尝试在一个例子的帮助下解释它。

我在 RDBMS

中有以下数据

ITEM MATERIAL
    pen plastic
    cell phone plastic
    mirror glass
    tshirt cloth
    bedsheet cloth

在我的代码中,我有一个变量material和以下查询
SELECT * FROM TABLE WHERE MATERIAL = {material} OR {material} = NULL;

考虑以下情况,

如果material == "plastic",那么输出将是

ITEM MATERIAL
    pen plastic
    cell phone plastic

如果material == "glass",那么输出将是

ITEM MATERIAL
    mirror glass

但是,如果material == null ,则输出将为(未应用过滤器)

ITEM MATERIAL
    pen plastic
    cell phone plastic
    mirror glass
    tshirt cloth
    bedsheet cloth

我想在 mongodb 中实现相同的目标 单个查询将根据material的值过滤数据,但在material == null时不应用过滤器。

如何实现这一目标?

我应该如何修改查询对象{"material" : _the_variable_material_}以获得相同的结果?

或者还有其他方法可以解决这个问题吗?

以下是包含相同数据的 mongodb 文档。

{
    "item": "pen",
    "material": "plastic"
},
{
    "item": "cell phone",
    "material": "plastic"
},
{
    "item": "mirror",
    "material": "glass"
},
{
    "item": "tshirt",
    "material": "cloth"
},
{
    "item": "bedsheet",
    "material": "cloth"
}

1 个答案:

答案 0 :(得分:0)

执行此查询的最佳方法是将其嵌套在if语句中,该语句用于计算_the_variable_material _的值:

if(_the_variable_material_ === 'null'){
    db.collection.find({});
} else {
    db.collection.find({ $or: [ { "material": _the_variable_material_ }, {"material": {$exists: false}}, {"material": null} ] })
}

或者,在单个查询中但性能较低:

    db.collection.find({ $or: [ { "material": _the_variable_material_ }, {"material": {$exists: false}}, {"material": null}, {$where: "this._the_variable_material_ == 'null'" } ] })