Doctrine ODM fetch documents with empty object (field type hash with no values)

Пускай у меня будет такая структура 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 где поле с типом hash является пустым объектом, то есть не имеет ни одного значения. Иными словами нужно достать все документы, где "variants.apps" (field type="hash") пустой (т.е. поле является пустым объектом).

Если в doctrine repository сделать поиск и в условии указать пустой массив:

<?php

class AssetRepository extends DocumentRepository
{
    /**
     * @return Asset[]
     */
    public function findWithEmptyApps(): array
    {
        return $this->findBy(
            [
                'variants.apps' => [],
            ]
        );
    }
}

То вернет 0 строк. То есть не подходит вариант.

Если же массив кастануть к пустому объекту в PHP-коде:

'variants.apps' => (object) []

то вернет запись с {_id:6182d3b232d0ae1e4323abc7} как и ожидается:

<?php

class AssetRepository extends DocumentRepository
{
    /**
     * @return Asset[]
     */
    public function findWithEmptyApps(): array
    {
        return $this->findBy(
            [
                'variants.apps' => (object) [],
            ]
        );
    }
}

 

 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться