乐闻世界logo
搜索文章和话题

如何使用 typeorm 在 postgres 的数组中搜索项

1 个月前提问
1 个月前修改
浏览次数26

1个答案

1

在使用 TypeORM 来管理 PostgreSQL 数据库时,你可能会遇到需要在数组字段中搜索特定项的情况。我将详细介绍如何在 Postgres 数组中使用 TypeORM 搜索特定项的几种方法。

首先,确保你的实体(Entity)中定义了数组字段。以一个简单的实体为例,我们将定义一个 User 实体,其中包含一个字符串数组字段 tags

typescript
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column("text", { array: true }) tags: string[]; }

1. 使用 @Query 直接查询

假设你需要找到所有标签数组中包含特定标签 "nodejs" 的用户。你可以直接使用 SQL 语句在 TypeORM 中执行这个查询:

typescript
import { EntityRepository, Repository } from 'typeorm'; import { User } from './user.entity'; @EntityRepository(User) export class UserRepository extends Repository<User> { findUsersByTag(tag: string): Promise<User[]> { return this.createQueryBuilder("user") .where(":tag = ANY(user.tags)", { tag }) .getMany(); } }

在这个例子中,ANY 函数是 PostgreSQL 中用来检查提供的值是否在数组中的一个方法。

2. 使用 QueryBuilder

这是一个更灵活的方法,因为它允许你链式添加更多的查询条件。这里演示如何使用 QueryBuilder 来找到包含特定标签的用户:

typescript
findUsersByTag(tag: string): Promise<User[]> { return this.createQueryBuilder("user") .where("user.tags @> ARRAY[:tag]", { tag }) .getMany(); }

在这个例子中,@> 是 PostgreSQL 的数组包含操作符,它检查左侧的数组是否包含右侧的数组。

3. 使用 TypeORM 的 find 方法

如果你的查询比较简单,你也可以使用 TypeORM 的 find 方法配合 ILIKE 来进行查询,这种方法适用于做全数组比对:

typescript
findUsersByWholeTags(tags: string[]): Promise<User[]> { return this.find({ where: { tags } }); }

这个方法假设你需要完全匹配 tags 数组,而不仅仅是匹配数组中的一个项。

结论

在处理 PostgreSQL 的数组时,TypeORM 提供了多种灵活的方法来查询包含特定项的数组。你可以使用直接的 SQL 查询,利用 QueryBuilder 来构建更复杂的查询,或者使用 find 方法进行简单的查询。每种方法都有其适用的场景,你可以根据具体的需求选择最合适的方法。

希望这些例子能帮助你更好地理解如何在实际工作中使用 TypeORM 来操作 PostgreSQL 中的数组数据。

2024年8月5日 00:41 回复

你的答案