我的节点应用程序上有一组条件 在哪里我试图实现以下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; )
或沿着这些方向的东西。
我可以在这里更简化我的查询吗?或者是否有更好,更有效的方式来获得这个必需的收藏。
答案 0 :(得分:1)
首先,让我们检查你的布尔条件。它有助于使用缩进在多行上写出来。把它写在一行上几乎让人无法理解。
(public==true && (varA=="something" || varB == "something"))
||
(public==false)
&&
(varA=="something" || varB == "something")
&&
(varc == "something")
让我们简化一下。让P
成为public==true
,让A
,B
,C
成为明显的条件。我不确定所有"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读者都会检查这一点,我会很感激,因为很明显,在推理和象征性操纵方面存在很多错误的机会。