我如何在mongo db查询下执行

时间:2016-10-14 13:09:57

标签: php regex mongodb mongodb-query regex-negation

{
   "$and":[ {
         "mobile_nos":{
            "$regex":{
               "regex":"^((?!Nagpur).)*$",
               "flags":"i"
            }
         }
      },
      {
         "full_name":{
            "$regex":{
               "regex":"^((?!pune).)*$",
               "flags":"i"
            }
         }
      }
   ]
}

上面的MongoDB查询不会产生任何结果,因为文档中不存在mobile_nos字段。

那么,如果文档中不存在字段,我该如何更改查询以便返回结果?

2 个答案:

答案 0 :(得分:1)

尝试将$or$exists

一起使用
{
 "$and":[ {
        $or:[
        {
         "mobile_nos":{
            "$regex":{
               "regex":"^((?!Nagpur).)*$",
               "flags":"i"
            }
         },
         {
          "mobile_nos":{
            $exists: false
          }
         }
        ]
       }
      },
      {
         "full_name":{
            "$regex":{
               "regex":"^((?!pune).)*$",
               "flags":"i"
            }
         }
      }
   ]
}

答案 1 :(得分:1)

如果字段存在,您可以尝试以下使用 $or 运算符的查询作为使用正则表达式搜索的逻辑条件,如果字段存在,则不要使用它不存在(使用 $exists 运算符)。

在这种情况下无需指定 $and 运算符,因为MongoDB在指定逗号分隔的表达式列表时提供了隐式AND操作。当必须在多个表达式中指定相同的字段或运算符时,必须使用带有 $and 运算符的显式AND

{
   "$or": [ 
        {
            "mobile_nos": {
                "$regex": {
                   "regex": "^((?!Nagpur).)*$",
                   "flags": "i"
                }
            }
        },
        { "mobile_nos": { "$exists": false } }
    ],
    "full_name": {
        "$regex": {
            "regex": "^((?!pune).)*$",
            "flags": "i"
        }
    }
}