Как использовать Sequelize для поиска в Postgresql по массиву объектов?

Как сделать запрос к таблице с колонкой "options" типа jsonb, чтобы найти элемент по заданному id? Вот пример моих наработок:
```javascript
let generateId = 1;
findOne({
        where: { options: { [Op.contains]: [{ id: generateId }] } },
})
```
Однако, данный запрос вызывает ошибку:
```
Invalid value { options: { [Symbol(contains)]: [Array] } }
at Object.escape
```
 Как можно исправить эту ошибку? В документации я не нашел подобных примеров.
  • 13 ноября 2023 г. 16:38
Ответы на вопрос 1
Ошибка возникает из-за того, что Sequelize не позволяет использовать оператор `[Op.contains]` для поиска в колонке типа JSONB.
 
Вместо этого, вы можете использовать оператор `[Op.contains]` для поиска в JSONB только с примитивными типами, такими как числа или строки. Для поиска по сложным объектам, как в вашем случае, вам необходимо использовать оператор `[Op.contains]` совместно с оператором `[Op.or]`.
 
Вот пример, как исправить ваш запрос:

```javascript
const { Op } = require('sequelize');

let generateId = 1;
findOne({
        where: { 
            options: {
                [Op.or]: [
                    { [Op.contains]: [{ id: generateId }] },
                    { [Op.contains]: [{ id: generateId.toString() }] } // если generateId представлен как строка
                ]
            }
        },
});
```

Оператор `[Op.or]` обеспечивает поиск по любому из условий внутри него. В примере мы ищем по полю `options` элемент, который содержит `id`, равное `generateId`. Альтернативно, если `generateId` представлен как строка, мы ищем элементы с числовым `id` или строковым `id` (если преобразовать `generateId` в строку).

Это должно исправить ошибку и позволить вам выполнять поиск по массиву объектов в колонке типа JSONB.
Похожие вопросы