在有效的mongoose中写一个复杂的if条件

时间:2014-08-11 21:51:23

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

我的节点应用程序上有一组条件 在哪里我试图实现以下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; )

或沿着这些方向的东西。

我可以在这里更简化我的查询吗?或者是否有更好,更有效的方式来获得这个必需的收藏。

1 个答案:

答案 0 :(得分:1)

首先,让我们检查你的布尔条件。它有助于使用缩进在多行上写出来。把它写在一行上几乎让人无法理解。

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

让我们简化一下。让P成为public==true,让ABC成为明显的条件。我不确定所有"something"是否意味着所有不同的值或全部相同或者是什么,所以我将假设固定值为* ,var*条件使用相同的"something"。那么条件是

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

这有点傻,所以让我们进一步简化。最简单的方法是使用符号+||* for和&&,因为布尔代数规则的工作方式与{{1}的规则相同以这种方式和+。不是*。我也开始使用并列~

*

行。让我们考虑一下这种情况。显然,我们需要(P * (A + B)) + ~P * (A + B) * C = PA + PB + (~P)AC + (~P)BC = A(P + (~P)C) + B(P + (~P)C) A中的一个为真。然后我们需要B为真。在条件中检查P + (~P)C是没有意义的,因为如果~P为真,我们就赢了,否则我们需要P,所以我们可以将条件简化为

C

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

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

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

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

如果你和任何其他慷慨的SO读者都会检查这一点,我会很感激,因为很明显,在推理和象征性操纵方面存在很多错误的机会。