StructuredQuery

Firestore 查詢。

查詢階段會以下列順序執行:1. 從 2. 開始,其中 3. 選取 4。 orderBy + startAt + endAt 5。位移 6。

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 之後開始查詢。

OFFSET 需要掃描前 N 個結果才能略過,但開始遊標允許查詢從邏輯位置開始。此位置不需要符合實際結果,系統會從這個位置向前掃描,尋找下一份文件。

需求:

  • 值的數量不得大於 ORDER BY 子句中指定的欄位數量。
endAt

object (Cursor)

在結果集中,為查詢結束位置的潛在前置字串。

這與 START_AT 類似,但前者是控制結束位置,而非起始位置。

需求:

  • 值的數量不得大於 ORDER BY 子句中指定的欄位數量。
offset

integer

傳回第一個結果前要略過的文件數量。

此情況會在 WHERESTART ATEND AT 指定的限制後方,但在 LIMIT 子句之前。

需求:

  • 指定的值必須大於或等於零。
limit

integer

要傳回的結果數上限。

在所有限制之後套用。

需求:

  • 指定的值必須大於或等於零。
findNearest

object (FindNearest)

選用設定。可能的鄰近搜尋。

套用到所有其他篩選條件和排序。

尋找最接近指定查詢向量的向量嵌入。

投影

要傳回的文件欄位投影。

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

需求:

  • 這部field首度於 orderBy推出。
LESS_THAN_OR_EQUAL

指定的 field 小於或等於指定的 value

需求:

  • 這部field首度於 orderBy推出。
GREATER_THAN

指定的 field 大於指定的 value

需求:

  • 這部field首度於 orderBy推出。
GREATER_THAN_OR_EQUAL

指定的 field 大於或等於指定的 value

需求:

  • 這部field首度於 orderBy推出。
EQUAL 指定 field 等於指定的 value
NOT_EQUAL

指定的 field 不等於指定的 value

需求:

  • 沒有其他 NOT_EQUALNOT_INIS_NOT_NULLIS_NOT_NAN
  • 這一field率先於 orderBy
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 是非空白的 ArrayValue,最多可有 10 個值。
  • 沒有其他 ORINARRAY_CONTAINS_ANYNOT_INNOT_EQUALIS_NOT_NULLIS_NOT_NAN
  • 這一field率先於 orderBy

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
  • 這一field率先於 orderBy
IS_NOT_NULL

指定的 field 不等於 NULL

需求:

  • 單一 NOT_EQUALNOT_INIS_NOT_NULLIS_NOT_NAN
  • 這一field率先於 orderBy

訂單

欄位上的訂單。

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 產品