在jsonb列的对象(TypeORM和Nest.js)中的对象数组中搜索字符串值



我面临的问题如下:

搜索值:"烹饪">

JSON对象:

data: {
skills: {
items: [ { name: 'cooking' }, ... ]
}
}

预期结果:应该找到所有的"技能项目";名称中包含"烹饪",使用TypeORMNest.js。

当前的代码不支持在后端进行搜索,我应该实现这一点。我想使用TypeORM功能,而不是用JavaScript处理它。

当前代码:(返回基于userId的数据(

const allItems = this.dataRepository.find({ where: [{ user: { id: userId } }] })

我研究了关于PostgreSQL函数的PostgreSQL文档,尽管我了解如何创建原始SQL查询,但我很难将其转换为等效的TypeORM。

注意:在创建此问题之前,我研究了许多StackOverflow问题,但如果我错过了正确的问题,请通知我。我很乐意调查。

你能帮我找出用TypeORM查询这个的方法吗?

更新

让我们考虑一下简单的原始查询:

SELECT *
FROM table1 t
WHERE t.data->'skills' @> '{"items":[{ "name": "cooking"}]}';

该查询将提供items数组中与精确名称匹配的任何item的结果——在这种情况下;烹饪";。

这完全可以,它可以作为原始请求执行,但在未来维护它肯定不容易,也不容易使用模式匹配和通配符(我找不到解决方案,如果你知道如何做到这一点,请分享!(。但是,当你必须进行精确匹配时,这个解决方案就足够了。我会根据新的发现不断更新这个问题。

在Where子句中使用Like:

servicePoint = await this.servicePointAddressRepository.find({
where: [{ ...isActive, name: Like("%"+key+"%"), serviceExecutive:{id: userId} },
{ ...isActive, servicePointId: Like("%"+key+"%")},
{ ...isActive, branchCode: Like("%"+key+"%")},
],
skip: (page - 1) * limit,
take: limit,
order: { updatedAt: "DESC" },
relations:["serviceExecutive","address"]
});

这可能会对你有所帮助!我在这里配钥匙。

最新更新