首先,让我们检查一下您的布尔条件。它有助于使用缩进将其写在多行上。写在一行上让人难以理解。
(public==true && (varA=="something" || varB == "something"))
||
(public==false)
&&
(varA=="something" || varB == "something")
&&
(varc == "something")
让我们简化一下。让P 成为public==true 并让A、B、C 成为显而易见的条件。我不确定所有 "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)
好的。让我们考虑一下这个条件。显然,我们需要 A 和 B 之一为真。然后我们需要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 读者能检查一下这一点,我将不胜感激,因为显然在推理和符号操作中存在很多错误机会。