【问题标题】:Writing a complex if condition in mongoose efficiently有效地在猫鼬中编写复杂的 if 条件
【发布时间】:2014-08-20 02:51:18
【问题描述】:

我的节点应用程序有一组条件 我正在尝试实现以下 if 块 -

if(((public==true)&&(varA=="something" || varB == "something")) || (public==false)&&(varA=="something" || varB == "something")&&(varc == "something"))

所以我试图实现的是 -

db.foo.find({"$or":[{"$and":[{e:true},{"$or":[{d:"four"},{c:"seven"}]}]},{"$and":[{e:false},{a:"one"},{"$or":[{c:"three"},{c:"seven"}]}]}]})

现在,变量 varA、varB、varC 是动态的,因此它们取决于用户的请求。所以我不能按原样编写查询对象。我将不得不以数组方式编写它

( like obj["$or][0]["$and"][e] = true; )

或类似的东西。

我可以在这里更简化我的查询吗?或者是否有更好、更有效的方法来获取所需的集合。

【问题讨论】:

    标签: node.js mongoose node-mongodb-native


    【解决方案1】:

    首先,让我们检查一下您的布尔条件。它有助于使用缩进将其写在多行上。写在一行上让人难以理解。

    (public==true && (varA=="something" || varB == "something")) 
    || 
    (public==false)
    && 
    (varA=="something" || varB == "something") 
    && 
    (varc == "something")
    

    让我们简化一下。让P 成为public==true 并让ABC 成为显而易见的条件。我不确定所有 "something" 是否意味着所有不同的值或都相同或什么,所以我将假设对于 * 的固定值,var* 条件使用相同的 @ 987654329@。那么条件是

    (P && (A || B)) 
    || 
    ~P
    && 
    (A || B) 
    && 
    C
    

    这有点傻,所以让我们尝试进一步简化。最简单的方法是使用符号+||*&&,因为布尔代数的规则与+* 的规则类似。不是~。我也将开始对* 使用并列。

    (P * (A + B)) + ~P * (A + B) * C =
    PA + PB + (~P)AC + (~P)BC =
    A(P + (~P)C) + B(P + (~P)C)
    

    好的。让我们考虑一下这个条件。显然,我们需要 AB 之一为真。然后我们需要P + (~P)C 为真。检查条件中的~P 是没有意义的,因为如果P 为真我们就赢了,否则我们需要C,所以我们可以将条件简化为

    A(P + C) + B(P + C)
    

    作为查询对象,它看起来像

    {
        "$or" : [
            {
                varA : "something",
                "$or" : [
                    { "public" : true },
                    { varC : "something" }
                ]
            },
            {
                varB : "something",
                "$or" : [
                    { "public" : true },
                    { varC : "something" }
                ]
            },
        ]
    }
    

    我会在 Javascript 中创建这个对象,如下所示:

    var myQuery = {
        "$or" : [
            {
                "$or" : [
                    { "public" : true },
                    { }
                ]
            },
            {
                "$or" : [
                    { "public" : true },
                    { }
                ]
            },
        ]
    };
    myQuery["$or"][0][varA] = "something";
    myQuery["$or"][1][varB] = "something";
    myQuery["$or"][0]["$or"][1][varC] = "something";
    myQuery["$or"][1]["$or"][1][varC] = "something";
    

    如果您和任何其他慷慨的 SO 读者能检查一下这一点,我将不胜感激,因为显然在推理和符号操作中存在很多错误机会。

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2014-02-20
      • 1970-01-01
      • 2015-11-27
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2014-10-30
      相关资源
      最近更新 更多