猫鼬 "and or" return 没有结果

mongoose "and or" return no result

我想找到与姓名或护照相匹配的记录,并且该记录未被暂停:

Person.find({'$or': [{name: name},
                     {passportNo: passportNo}
                    ], 
             "$and":[{suspended: false}]
            }, function(err, result){

我没有记录,我做的对吗?

$and 语句应位于开头,并且应包含两个单独的条件(记录未暂停)和(姓名或护照匹配的 OR 语句)

{"$and":[{suspended: false}, {'$or': [{name: name}, {passportNo: passportNo}]}] }

*****更新

这里是根据以下逻辑更新的语句
(姓名字段匹配且暂停为假)或(passportNo 字段匹配且暂停为假)

{"$or":[{'$and': [{name: name}, {suspended: false}]}, {'$and': [{passportNo: passportNo}, {suspended: false}]}] }

这是否符合您正在寻找的逻辑?

****** 更新 2

此查询现在正在检查是否
(suspended 字段存在且其值为 false 且姓名或护照字段匹配)
或(暂停字段不存在且姓名或护照字段匹配)

   {
'$or': [
   {"$and":[
            { "suspended": { $exists: true, $in: [ false ] } }, 
            {'$or': [{"name": name}, {"passportNo": passportNo}]} ]
     },
    {"$and":[
            { "suspended": { $exists: false } } ,
            {'$or': [{"name": name}, {"passportNo": passportNo}]} ]
     } ]
}

如果问题是

Find all documents where (name is X or passportNo is Y) and (suspended is false or not present)

使用以下查询:

{
    "$and" : [
        { "$or" : [
            { "name" : X }, 
            { "passportNo" : Y } 
        ] }, 
        { "$or" : [
            { "suspended" : false }, 
            { "suspended" : { "$exists" : false } } 
        ] }
    ]
}

不过,您应该通过将 suspended 默认设置为 false 来简化您的生活,这样查询就可以是

{
    { "$or" : [{ "name" : X }, { "passportNo" : Y } ] }, 
    { "suspended" : false }, 
}