Docs 菜单

Docs 主页开发应用程序Atlas Device SDKs

查询数据 - React Native SDK

在此页面上

  • 结果集合
  • 本页中的示例
  • 构建查询
  • 使用全文搜索进行过滤
  • 操作符
  • 比较操作符。
  • 逻辑操作符
  • 字符串操作符
  • 聚合操作符
  • 集合操作符
  • 总结

您可以查询 Realm 以根据对象的类型及其属性的值来查找对象。对象和查询始终反映对象的最新状态,并发出通知,这些通知可以在数据发生变化时更新您的应用。

要过滤 Realm 中的数据,请使用 Realm 查询语言来构造查询。有关语法、用法和限制的更多信息,请参阅 Realm 查询语言参考文档。

结果集合表示 Realm 中与某一查询操作匹配的所有对象。一般来说,您可以像使用常规 JavaScript 数组一样来使用集合,但集合实际上并不在内存中保存匹配的 Realm 对象。取而代之的是,它们会引用匹配的对象,这些对象本身直接映射到 Realm 文件中的数据。

注意

分页和限制

某些查询只需要访问与查询匹配的所有对象的子集。 Realm 的延迟加载集合仅在您实际访问对象时才获取对象,因此您不需要任何特殊的机制来限制查询结果。

例如,如果您只想一次查找 10 个匹配对象(例如在分页产品目录中),则只需访问结果集合的 10 个元素即可。若要前进到下一页,请访问结果集合的后 10 个元素,从紧跟上一页最后一个元素的索引开始。

本页中的示例使用了一个任务列表应用的简单数据集。两种 Realm 对象类型分别是 ProjectTaskTask 具有名称、受让人名称和已完成标志。其中还有一个任意的优先级数字(数值越高表示越重要)以及处理所花费的分钟数。Project 具有零个或多个 Tasks

请参阅 ProjectTask 这两个类的模式:

const TaskSchema = {
name: "Task",
properties: {
name: "string",
isComplete: "bool",
priority: "int",
progressMinutes: "int",
assignee: "string?"
}
};
const ProjectSchema = {
name: "Project",
properties: {
name: "string",
tasks: "Task[]"
}
};

要筛选数据,请将使用 Realm Query Language 进行的查询传递给Realm.Results.filtered()

const items = realm.objects("Item");
// Gets all items where the 'priority' property is 7 or more.
const importantItems = items.filtered("priority >= $0", 7);

您可以使用 Realm Query Language (RQL) 来查询具有全文搜索(FTS) 索引的属性。首先,使用useQuery()返回您要过滤的 Realm 对象的集合。要查询集合内对象的 FTS 索引属性,请在筛选后的查询中使用TEXT谓词。

在单词前加上 - 字符以排除该单词的结果。例如,swan -lake 的搜索中将包括 swan 的所有搜索结果,但不包括 lake 的搜索结果。

在以下示例中,我们使用以下Book对象模型查询Book.name字段:

class Book extends Realm.Object<Book> {
name!: string;
price?: number;
static schema: ObjectSchema = {
name: 'Book',
properties: {
name: {type: 'string', indexed: 'full-text'},
price: 'int?',
},
};
}
import {useQuery} from "@realm/react";
// Retrieve book objects from realm
const books = useQuery(Book);
// Filter for books with 'hunger' in the name
const booksWithHunger = useQuery(Book, books => {
return books.filtered('name TEXT $0', 'hunger');
});
// Filter for books with 'swan' but not 'lake' in the name
const booksWithSwanWithoutLake = useQuery(Book, books => {
return books.filtered('name TEXT $0', 'swan -lake');
});

全文搜索 (FTS) 索引支持:

  • 布尔匹配词搜索,而不支持相关性搜索。

  • 词汇单元(token)不区分变音符号和大小写。

  • 词汇单元只能包含 ASCII 和 Latin-1 补充(西方语言)中的字符。

  • 所有其他字符均被视为空格。由连字符 (-) 连接的单词(例如 full-text)会被分割为两个词汇单元。

可使用多种类型的操作符来过滤 Realm 集合。过滤器的工作方式是对所过滤的集合中的每个对象计算操作符表达式。如果表达式解析为 true ,Realm 数据库会将该对象包含在结果集合中。

表达式由以下任一内容组成:

  • 当前正在评估的对象的某个属性的名称。

  • 一个运算符和最多两个参数表达式。

  • 文字字符串、数字或日期。

搜索中最直接的操作就是比较值。Realm 查询语言采用标准比较运算符,如 ==>>=in<<=!=

有关比较操作符的完整文档,请参阅 Realm 查询语言比较操作符参考

以下示例使用查询引擎的比较运算符执行以下操作:

  • 通过将 priority 属性值与阈值数字进行比较来查找高优先级任务,而高于该阈值的优先级可视为高优先级。

  • 通过查看 progressMinutes 属性是否在特定范围内来查找刚刚启动或短时间运行的任务。

  • 通过查找 assignee 属性等于 null 的任务来查找未分配的任务。

  • 通过查看 assignee 属性是否在名称列表中来查找分配给团队成员 Ali 或 Jamie 的任务。

const highPriorityTasks = tasks.filtered("priority > $0", 5);
const unassignedTasks = tasks.filtered("assignee == $0", null);
const lowProgressTasks = tasks.filtered("$0 <= progressMinutes && progressMinutes < $1", 1, 10);
const aliTasks = tasks.filtered("assignee == $0", "Ali");
console.log(
`Number of high priority tasks: ${highPriorityTasks.length}`,
`Number of unassigned tasks: ${unassignedTasks.length}`,
`Number of just-started or short-running tasks: ${lowProgressTasks.length}`,
`Number of tasks for Ali: ${aliTasks.length}`
);

使用逻辑运算符创建复合谓词。Realm 查询语言采用标准逻辑运算符,如 ANDORNOT

有关逻辑操作符的完整文档,请参阅 Realm 查询语言逻辑操作符参考

以下示例使用 Realm 查询语言的逻辑操作符来查找 Ali 已完成的所有任务。我们查找所有 assignee 属性值等于“Ali”且 isComplete 属性值为 true 的任务。

console.log(
"Number of Ali's complete tasks: " +
tasks.filtered("assignee == $0 && isComplete == $1", "Ali", true).length
);

您可以使用 ==beginsWithcontainsendsWith 等字符串操作符来比较字符串值。借助 LIKE 操作符,您还可以使用类似正则表达式的通配符来进行搜索。

有关字符串操作符的完整文档,请参阅 Realm 查询语言字符串操作符参考

以下示例使用 Realm 查询语言的字符串操作符来查找名称以字母“e”开头的项目以及名称中包含“ie”的项目。

// Use [c] for case-insensitivity.
console.log(
"Projects that start with 'e': " +
projects.filtered("name BEGINSWITH[c] $0", 'e').length
);
console.log(
"Projects that contain 'ie': " +
projects.filtered("name CONTAINS $0", 'ie').length
);

遍历集合并使用聚合运算符将其减少为单个值。

有关聚合操作符的完整文档,请参阅 Realm 查询语言聚合操作符参考

以下示例使用聚合操作符来显示数据的不同方面:

  • @avg 显示平均任务优先级大于 5 的项目。

  • @sum 显示长时间运行的项目。

console.log(
"Number of projects with average tasks priority above 5: " +
projects.filtered("tasks.@avg.priority > $0", 5).length
);
console.log(
"Number of long-running projects: " +
projects.filtered("tasks.@sum.progressMinutes > $0", 120).length
);

集合操作符使用规则来确定是否将每个输入集合对象传递给输出集合,方法是将给定谓词应用于对象的给定列表属性的每个元素。

有关集合操作符的完整文档,请参阅 Realm 查询语言比较操作符参考文档

以下示例使用 Realm 查询语言集合操作符进行查找:

  • ALL (针对未包含完成任务的项目。)

  • ANY 适用于任何具有最高优先级任务的项目。

console.log(
"Number of projects with no complete tasks: " +
projects.filtered("ALL tasks.isComplete == $0", false).length
);
console.log(
"Number of projects with any top priority tasks: " +
projects.filtered("ANY tasks.priority == $0", 10).length
);
  • 使用Realm.Results.filtered通过 Realm Query Language 筛选 Realm 中的数据。

  • 有关 Realm 查询语言的详细说明,请参阅 Realm 查询语言参考。

  • 有多种类别的操作符可用于筛选结果: - 比较 - 逻辑 - 字符串 - 聚合 - 集合

← CRUD - 删除 - React Native SDK