mongoose“和或”没有结果

时间:2015-02-05 14:40:06

标签: mongodb mongodb-query

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

*****更新

这是基于以下逻辑的更新声明
(名称字段匹配AND暂挂为false)或(passportNo字段匹配AND暂停为false)

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

这与您正在寻找的逻辑相匹配吗?

******更新2

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

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

答案 1 :(得分:1)

如果问题是

  

查找所有文档(name为X或passportNo为Y)和(suspendedfalse或不存在)

使用以下查询:

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

默认情况下,您应该将suspended设置为false来简化您的生活,因此查询可以只是

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