Я использую Postgres JSONB, чтобы хранить кучу свойств в одном поле для одной сложной системы.
Там, где у меня есть одно поле, это называется свойствами, а свойства имеют деревья объектов.
Вот небольшой фрагмент данных из свойств.
{
"urls": [],
"games": false,
"images": [],
"rating": null,
"founded": 0,
"bannedIn": ["00000000-0000-0000-8888-000000000001",
"00000000-0000-0000-8888-000000000002"],
"comments": "",
"chat": false
}
В таблице у меня есть некоторые объекты, для которых bannedIn имеет некоторые направляющие, у некоторых объектов есть пустой массив, а у некоторых объектов вообще нет свойства bannedIn.
Теперь я пытаюсь получить все строки, где содержится bannedIn "00000000-0000-0000-8888-000000000001"
(РАБОТАЕТ)
Когда я пытаюсь получить каждую строку, где bannedIn не содержит "00000000-0000-0000-8888-000000000001"
(РАБОТАЕТ)
Но когда я запрашиваю подсчет всех, где свойства вообще не имеют bannedIn, это происходит с нулевым счетом, даже если у меня есть объект 1K без bannedIn.
РАБОТАЕТ
$builder = $entityManager->createQueryBuilder()
->select('e')
->from(Entity::class, 'e')
->where('e.otherObject = :guid')->setParameter('guid', $guid)
->andWhere('GET_JSON_FIELD(e.properties, \'bannedIn\') LIKE ?1')
->setParameter(1, '%00000000-0000-0000-8888-000000000001%');
Есть ли способ запросить JSONB, где ключ не существует?
Я также попытался следовать, не работал.
? Оператор реализуется путем вызова его функции jsonb_exists(column_name, value)
Задача ещё не решена.
Других решений пока нет …