Node.js 在mongoose中高效地编写复杂的if条件

Node.js 在mongoose中高效地编写复杂的if条件,node.js,mongoose,node-mongodb-native,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:

我在我的节点应用程序上有一组条件 当我试图实施以下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; )
或者类似的东西


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

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

(public==true && (varA=="something" || varB == "something")) 
|| 
(public==false)
&& 
(varA=="something" || varB == "something") 
&& 
(varc == "something")
让我们简化一下。让
P
成为
public==true
,让
A
B
C
成为明显的条件。我不确定是否所有的
“某物”
都是不同的值或相同的值,所以我假设对于固定值*,
var*
条件使用相同的
“某物”
。那么情况是

(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";
如果您和任何其他慷慨的读者能够检查一下,我将不胜感激,因为显然,在推理和符号操作中存在许多错误的机会