StructuredQuery

Firestore 查询。

查询阶段按以下顺序执行:1. 从 2. 其中 3. 选择 4. orderBy + startAt + endAt 5. offset 6. limit

JSON 表示法
{
  "select": {
    object (Projection)
  },
  "from": [
    {
      object (CollectionSelector)
    }
  ],
  "where": {
    object (Filter)
  },
  "orderBy": [
    {
      object (Order)
    }
  ],
  "startAt": {
    object (Cursor)
  },
  "endAt": {
    object (Cursor)
  },
  "offset": integer,
  "limit": integer,
  "findNearest": {
    object (FindNearest)
  }
}
字段
select

object (Projection)

要返回的可选字段子集。

这充当从查询返回的文档的 DocumentMask。如果未设置,则假定调用方希望返回所有字段。

from[]

object (CollectionSelector)

要查询的集合。

where

object (Filter)

要应用的过滤条件。

orderBy[]

object (Order)

要应用于查询结果的顺序。

Firestore 允许调用方提供完整排序、部分排序或完全不排序。在所有情况下,Firestore 都会通过以下规则保证稳定排序:

  • 必须提供 orderBy 才能引用不等性过滤条件使用的所有字段。
  • 需要包含在 orderBy 中但尚不存在的所有字段都会按字段名称的字典顺序附加。
  • 如果未指定 __name__ 的订单,系统会默认附加该订单。

字段将附加与最后一个指定顺序相同的排序方向,如果未指定排序顺序,则为“ASCENDING”。例如:

  • ORDER BY a 会变为 ORDER BY a ASC, __name__ ASC
  • ORDER BY a DESC 会变为 ORDER BY a DESC, __name__ DESC
  • WHERE a > 1 会变为 WHERE a > 1 ORDER BY a ASC, __name__ ASC
  • WHERE __name__ > ... AND a > 1 会变为 WHERE __name__ > ... AND a > 1 ORDER BY a ASC, __name__ ASC
startAt

object (Cursor)

结果集中开始查询的位置的可能前缀。

结果集的排序基于原始查询的 ORDER BY 子句。

SELECT * FROM k WHERE a = 1 AND b > 2 ORDER BY b ASC, __name__ ASC;

此查询的结果按 (b ASC, __name__ ASC) 排序。

游标可以引用位置的完整排序或前缀,但其引用的字段不能超过提供的 ORDER BY 中的字段。

继续上面的示例,附加以下开始游标会产生不同的影响:

  • START BEFORE (2, /k/123):在 a = 1 AND b > 2 AND __name__ > /k/123 前面开始查询。
  • START AFTER (10):紧跟在 a = 1 AND b > 10 之后开始查询。

与需要跳过前 N 个结果的 OFFSET 不同,起始游标允许查询从某个逻辑位置开始。此位置并非必须匹配实际结果,它会从此位置向前扫描以查找下一个文档。

需要:

  • 值的数量不能大于 ORDER BY 子句中指定的字段数量。
endAt

object (Cursor)

结果集中查询结束位置的潜在前缀。

这与 START_AT 类似,但它控制的是结束位置,而不是起始位置。

需要:

  • 值的数量不能大于 ORDER BY 子句中指定的字段数量。
offset

integer

在返回第一个结果之前要跳过的文档数量。

这在 WHERESTART ATEND AT 指定的约束条件之后、LIMIT 子句之前适用。

需要:

  • 如果指定,该值必须大于或等于零。
limit

integer

要返回的结果数上限。

在所有其他限制条件之后应用。

需要:

  • 如果指定,该值必须大于或等于零。
findNearest

object (FindNearest)

可选。潜在的“最近邻”搜索。

在所有其他过滤条件和排序之后应用。

查找与指定查询向量最接近的向量嵌入。

Projection

要返回的文档字段的投影。

JSON 表示法
{
  "fields": [
    {
      object (FieldReference)
    }
  ]
}
字段
fields[]

object (FieldReference)

要返回的字段。

如果为空,则返回所有字段。如需仅返回文档的名称,请使用 ['__name__']

CollectionSelector

对集合的选择,例如 messages as m1

JSON 表示法
{
  "collectionId": string,
  "allDescendants": boolean
}
字段
collectionId

string

集合 ID。设置后,仅选择具有此 ID 的集合。

allDescendants

boolean

如果为 false,则仅选择属于所包含 RunQueryRequest 中指定的 parent 的直接子项的集合。如果为 true,则会选择所有后代集合。

过滤

过滤器。

JSON 表示法
{

  // Union field filter_type can be only one of the following:
  "compositeFilter": {
    object (CompositeFilter)
  },
  "fieldFilter": {
    object (FieldFilter)
  },
  "unaryFilter": {
    object (UnaryFilter)
  }
  // End of list of possible types for union field filter_type.
}
字段
联合字段 filter_type。过滤器的类型。filter_type 只能是下列其中一项:
compositeFilter

object (CompositeFilter)

复合过滤条件。

fieldFilter

object (FieldFilter)

基于文档字段的过滤条件。

unaryFilter

object (UnaryFilter)

仅接受一个参数的过滤条件。

CompositeFilter

使用给定运算符合并多个其他过滤条件的过滤条件。

JSON 表示法
{
  "op": enum (Operator),
  "filters": [
    {
      object (Filter)
    }
  ]
}
字段
op

enum (Operator)

合并多个过滤条件的运算符。

filters[]

object (Filter)

要组合的过滤条件的列表。

需要:

  • 至少存在一个过滤条件。

运算符

复合过滤器运算符。

枚举
OPERATOR_UNSPECIFIED 未指定。不得使用此值。
AND 文档必须满足所有组合的过滤条件。
OR 文档必须满足至少一个组合过滤条件的要求。

FieldFilter

针对特定字段的过滤条件。

JSON 表示法
{
  "field": {
    object (FieldReference)
  },
  "op": enum (Operator),
  "value": {
    object (Value)
  }
}
字段
field

object (FieldReference)

要作为过滤条件的字段。

op

enum (Operator)

作为过滤条件的运算符。

value

object (Value)

要比较的值。

运算符

字段过滤器运算符。

枚举
OPERATOR_UNSPECIFIED 未指定。不得使用此值。
LESS_THAN

给定 field 小于给定 value

需要:

  • fieldorderBy 中排在最前面。
LESS_THAN_OR_EQUAL

给定 field 小于或等于给定 value

需要:

  • fieldorderBy 中排在最前面。
GREATER_THAN

给定 field 大于给定 value

需要:

  • fieldorderBy 中排在最前面。
GREATER_THAN_OR_EQUAL

给定 field 大于或等于给定 value

需要:

  • fieldorderBy 中排在最前面。
EQUAL 给定 field 等于给定 value
NOT_EQUAL

给定 field 不等于给定 value

需要:

  • 没有其他的 NOT_EQUALNOT_INIS_NOT_NULLIS_NOT_NAN
  • fieldorderBy 中排在首位。
ARRAY_CONTAINS 指定 field 是包含指定 value 的数组。
IN

给定 field 等于给定数组中的至少一个值。

需要:

  • value 是一个非空 ArrayValue,受析取限制的约束。
  • 同一查询中没有 NOT_IN 过滤条件。
ARRAY_CONTAINS_ANY

指定 field 是包含指定数组中所有值的数组。

需要:

  • value 是一个非空 ArrayValue,受析取限制的约束。
  • 同一个析取运算中没有其他 ARRAY_CONTAINS_ANY 过滤条件。
  • 同一查询中没有 NOT_IN 过滤条件。
NOT_IN

field 的值不在给定数组内。

需要:

  • value 是最多包含 10 个值的非空 ArrayValue
  • 没有其他的 ORINARRAY_CONTAINS_ANYNOT_INNOT_EQUALIS_NOT_NULLIS_NOT_NAN
  • fieldorderBy 中排在首位。

UnaryFilter

具有单个操作数的过滤条件。

JSON 表示法
{
  "op": enum (Operator),

  // Union field operand_type can be only one of the following:
  "field": {
    object (FieldReference)
  }
  // End of list of possible types for union field operand_type.
}
字段
op

enum (Operator)

要应用的一元运算符。

联合字段 operand_type。过滤器的参数。operand_type 只能是下列其中一项:
field

object (FieldReference)

要应用运算符的字段。

运算符

一元运算符。

枚举
OPERATOR_UNSPECIFIED 未指定。不得使用此值。
IS_NAN 给定的 field 等于 NaN
IS_NULL 给定的 field 等于 NULL
IS_NOT_NAN

给定的 field 不等于 NaN

需要:

  • 没有其他的 NOT_EQUALNOT_INIS_NOT_NULLIS_NOT_NAN
  • fieldorderBy 中排在首位。
IS_NOT_NULL

给定的 field 不等于 NULL

需要:

  • 单个 NOT_EQUALNOT_INIS_NOT_NULLIS_NOT_NAN
  • fieldorderBy 中排在首位。

订单

字段上的订单。

JSON 表示法
{
  "field": {
    object (FieldReference)
  },
  "direction": enum (Direction)
}
字段
field

object (FieldReference)

要排序的字段。

direction

enum (Direction)

排序依据。默认为 ASCENDING

方向

排序方向。

枚举
DIRECTION_UNSPECIFIED 未指定。
ASCENDING 升序。
DESCENDING 降序。

FindNearest

最近邻搜索配置。

JSON 表示法
{
  "vectorField": {
    object (FieldReference)
  },
  "queryVector": {
    object (Value)
  },
  "distanceMeasure": enum (DistanceMeasure),
  "limit": integer
}
字段
vectorField

object (FieldReference)

必需。要搜索的索引矢量字段。只能返回包含维度与 queryVector 相匹配的向量的文档。

queryVector

object (Value)

必需。我们要搜索的查询向量。必须是一个维度不超过 2048 个的矢量。

distanceMeasure

enum (DistanceMeasure)

必需。要使用的距离测量。

limit

integer

必需。要返回的最近相邻项的数量。必须是不大于 1000 的正整数。

DistanceMeasure

比较向量时要使用的距离度量。

枚举
DISTANCE_MEASURE_UNSPECIFIED 不应设置。
EUCLIDEAN 测量向量之间的 EUCLIDEAN 距离。如需了解详情,请参阅欧几里得
COSINE 根据向量之间的角度比较向量,以便您衡量不基于向量大小的相似度。我们建议将 DOT_PRODUCT 与单位归一化向量一起使用,而不是使用 COSINE 距离,因为后者在数学上是等效的,且性能更佳。如需了解详情,请参阅余弦相似度
DOT_PRODUCT 与余弦相似,但受向量大小的影响。如需了解详情,请参阅 Dot Product