Как я могу выполнить запрос ниже mongo db

#php #regex #mongodb #mongodb-query #regex-negation

#php #регулярное выражение #mongodb #mongodb-запрос #регулярное выражение-отрицание

Вопрос:

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

Приведенный выше запрос MongoDB не дает никакого результата, потому mobile_nos что поле не существует в документе.

Итак, как я могу изменить запрос, чтобы он возвращал результат, если поле не существует в документе?

Ответ №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"
        }
    }
}
 

Ответ №2:

Попробуйте использовать $или с $exists:

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