Пускай у меня будет такая структура json в mongoDb:
{
"_id" : ObjectId("6182d3b232d0ae1e4323abc7"),
"status" : NumberInt(1),
"variants" : [
{
"id" : "6182d3b2b6ced",
"url" : "2021/10/filename1",
"apps" : {
"100020" : "2.2.0",
"100100" : null
},
},
{
"id" : "6182d3b2b6d03",
"apps" : {
},
}
],
},
{
"_id" : ObjectId("6182d3b232d0ae1e4323abc8"),
"status" : NumberInt(1),
"variants" : [
{
"id" : "idid1",
"url" : "2021/10/filename2",
"apps" : {
"100020" : "2.2.0",
},
}
],
}
Использую Doctrine и ODM, база данных MongoDB. Нужно получить все записи из mongoDb где поле с типом hash является пустым объектом, то есть не имеет ни одного значения. В примере выше: это строки 15-17, где поле "apps" пустой объект в mongoDb.
Иными словами, нужно достать все документы, где "variants.apps" (field type="hash") пустой (т.е. поле является пустым объектом).
Если в doctrine repository сделать поиск и в условии указать пустой массив:
<?php
class AssetRepository extends DocumentRepository
{
/**
* @return Asset[]
*/
public function findWithEmptyApps(): array
{
return $this->findBy(
[
'variants.apps' => [],
]
);
}
}
То в результате выполнения этого кода и запроса вернется 0 строк в ответ. То есть не ожидаемый мной результат.
Как же в doctrine сделать выборку по пустому объекту в mongoDB?
Если же при передаче параметров пустой массив кастануть к пустому объекту в PHP-коде:
'variants.apps' => (object) []
то вернет запись с {_id:6182d3b232d0ae1e4323abc7} как и ожидается:
<?php
class AssetRepository extends DocumentRepository
{
/**
* @return Asset[]
*/
public function findWithEmptyApps(): array
{
return $this->findBy(
[
'variants.apps' => (object) [],
]
);
}
}
То есть передача в findBy() как значение пустового массива, кастованного в объект (object) [], и является решением.