У меня есть такие документы, как
{
'_id': ...
'registration_temp_perm_no' => 'SIEI/216/2020',
'first_name' => 'Azra',
'last_name' => 'Ali'
},
{
'_id': ...
'registration_temp_perm_no': ....
'first_name': ...,
'last_name' : ...,
'transport_details' : [
{
...
status : "Inactive"
}
]
},
{
'_id': ...
'registration_temp_perm_no':...
'first_name' : ....
'last_name': .....,
'transport_details': []
}
Обратите внимание, что документы создаются / обновляются с помощью функциональных возможностей внешнего интерфейса следующими тремя способами:
, где встроенный документ 'transport_details 'вообще не существует.
, где встроенный документ' transport_details 'содержит пустой массив
, где встроенный документ' transport_details 'может содержать несколько вложенных массивы
Теперь я хочу получить те документы, в которых состояние последнего вложенного массива равно «Неактивно» или «Запрошено», а вспомогательный массив «transport_details» не существует и «transport_details» "пусто.
Я написал запрос наподобие
$query = array(
'$or' => array(
array("first_name" => new MongoDB\BSON\Regex($arg, 'i')),
array("middle_name" => new MongoDB\BSON\Regex($arg, 'i')),
array("last_name" => new MongoDB\BSON\Regex($arg, 'i')),
array("registration_temp_perm_no" => $arg)
),
"schoolId"=> new MongoDB\BSON\ObjectID($this->schoolId),
'$expr' => [
'$or' => [
['transport_details' => ['$exists' => false]],
['transport_details' => ['$size' => 0]],
['$eq'=> [['$arrayElemAt' => ['$transport_details.status', -1]], "Requested"]],
['$eq'=> [['$arrayElemAt' => ['$transport_details.status', -1]], "Inactive"]],
]
]
);
Если мы удалим строки ['transport_details' => ['$ exist' => false]], ['transport_details' => ['$ size' => 0]], запрос может извлекать те документы, для которых состояние последнего подмассива имеет статус «Неактивно» или «Запрошено», в противном случае он не работает.