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

How do I query an array in TypeORM

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

1个答案

1

在使用 TypeORM 操作数据库时,我们常常需要查询存储在数组字段中的数据。在 PostgreSQL 中,这样的字段通常被定义为数组类型。在 TypeORM 中,我们可以通过几种方式来查询这样的数组字段,这里我将介绍几种常用的查询方法。

1. 判断数组中是否包含某个值

假设我们有一个名为 User 的实体,其中有一个 hobbies 字段,类型为字符串数组。我们希望查询所有喜好中包含 "reading" 的用户。

typescript
import { getRepository } from "typeorm"; import { User } from "./entity/User"; async function findUsersByHobby() { const userRepository = getRepository(User); const users = await userRepository.find({ where: { hobbies: "reading" } }); return users; }

2. 使用 @>, <@, && 运算符

PostgreSQL 提供了特殊的数组运算符来帮助我们进行更复杂的查询。例如:

  • @> 表示左边数组是否包含右边数组。
  • <@ 表示左边数组是否被右边数组包含。
  • && 表示两个数组是否有交集。

示例:查询喜好包含至少包含 "reading" 和 "cooking" 的用户

typescript
import { getRepository } from "typeorm"; import { User } from "./entity/User"; async function findUsersByMultipleHobbies() { const userRepository = getRepository(User); const users = await userRepository.createQueryBuilder("user") .where("user.hobbies @> ARRAY[:...hobbies]", { hobbies: ["reading", "cooking"] }) .getMany(); return users; }

3. 查询数组长度

有时候我们需要根据数组的长度来进行查询,例如找出喜好超过 3 个的用户。

typescript
import { getRepository } from "typeorm"; import { User } from "./entity/User"; async function findUsersByHobbiesCount() { const userRepository = getRepository(User); const users = await userRepository.createQueryBuilder("user") .where("array_length(user.hobbies, 1) > :count", { count: 3 }) .getMany(); return users; }

以上就是在 TypeORM 中查询数组的几种方法。通过利用原生 SQL 功能和 TypeORM 提供的方法,我们可以灵活地处理各种数组相关的查询需求。

2024年6月29日 12:07 回复

你的答案