Azure 和 DB 中的 JavaScript Cosmos API

適用于 :SQL API

除了在 Azure Cosmos DB 中使用 SQL API 發出查詢之外,Cosmos DB伺服器端 SDK 還提供 JavaScript 介面,在 Cosmos DB 儲存程式和觸發程式中執行優化的查詢。 使用這個 JavaScript 介面時,您SQL這些語言。 JavaScript 查詢 API 可讓您以程式設計方式建立查詢,將謂詞函數傳遞至函式呼叫的順序,並採用ECMAScript5 陣列內建和 Lodash 等熱門 JavaScript 文件庫所熟悉的語法。 查詢會由 JavaScript 執行時間剖析,並且使用 Azure 或 DB 索引Cosmos執行。

支援的 JavaScript 函數

功能 描述
chain() ... .value([callback] [, options]) 啟動必須以值 () 結束的鏈式通話。
filter(predicateFunction [, options] [, callback]) 使用會返回 true/false 的謂詞函數來篩選輸入,以將輸入檔篩選到結果集。 此函數的行為類似于中 WHERE 子句SQL。
flatten([isShallow] [, options] [, callback]) 將每個輸入專案的陣列合併並壓平成單一陣列。 此函數的行為類似于 LINQ 中的 SelectMany。
map(transformationFunction [, options] [, callback]) 使用指定轉換函數的投影,將每個輸入專案與 JavaScript 物件或值進行比對。 此函數的行為類似于 SQL 中的 SELECT 子句。
pluck([propertyName] [, options] [, callback]) 此函數是從每個輸入專案中提取單一屬性的值之地圖的快捷方式。
sortBy([predicate] [, options] [, callback]) 使用給定的謂詞以遞增順序排序輸入檔串流中的檔,以產生一組新的檔。 此函數的行為類似 ORDER BY 子句在 SQL。
sortByDescending([predicate] [, options] [, callback]) 使用給定的謂詞以遞減順序排序輸入檔串流中的檔,以產生一組新的檔。 此函數的行為類似于 ORDER BY x DESC 子句SQL。
unwind(collectionSelector, [resultSelector], [options], [callback]) 使用內部陣列執行自我連接,並將雙方的結果新增為 tuple 到結果投影。 例如,將人員檔與 person.pet 聯入會產生 [個人、寵物] Tuple。 這類似于 .NET LINQ 中的 SelectMany。

當包含在謂詞和/或選取器函數中時,下列 JavaScript 結構會自動優化,直接在 Azure Cosmos DB 索引上執行:

  • 簡單的運算子: =+-*/%|^&==!====!===<><=>=||&&<<>>>>>!~
  • 文字,包括物件文字: {}
  • var, return

下列 JavaScript 結構並未針對 Azure 和 DB 索引Cosmos優化:

  • 控制項流程 (例如,若為,而)
  • 函數通話

詳細資訊請參閱 DB Server side JavaScript 檔Cosmos DB Server Side JavaScript 檔

SQL JavaScript 備忘稿

下表列出各種SQL及對應的 JavaScript 查詢。 與查詢SQL一樣,屬性 (例如 item.id) 區分大小寫。

注意

__ (雙) 是使用 JavaScript 查詢 API 時使用的 getContext().getCollection() 別名。

SQL JavaScript 查詢 API 描述
SELECT *
FROM 檔
_.map (檔 (函數) {
    退貨檔;
});
結果會以 (標記分頁) 檔。
選擇
   docs.id,
   docs.message AS msg,
   docs.actions
FROM 檔
_.map (檔 (函數) {
    return {
        id:doc.id,
        msg:doc.message,
        動作:doc.actions
    };
});
將識別碼、郵件 (為 msg) ,以及所有檔的動作。
SELECT *
FROM 檔
位置
   docs.id="X998_Y998"
__.filter (函數 (檔) {
    返回 doc.id ==="X998_Y998";
});
包含謂詞的檔查詢:id = "X998_Y998"。
SELECT *
FROM 檔
位置
   ARRAY_CONTAINS (檔。標記,123)
_.filter (x (x) 函數 {
    return x.Tags && x.tags.indexOf (123) > -1;
});
具有 Tags 屬性和標記的檔查詢是包含值 123 的陣列。
選擇
   docs.id,
   docs.message AS msg
FROM 檔
位置
   docs.id="X998_Y998"
__.chain ()
    .filter (函數 (檔) {
        返回 doc.id ==="X998_Y998";
    })
    .map (函數 (檔) {
       return {
            id:doc.id,
            msg:doc.message
       };
    })
.value () ;
查詢包含謂詞的檔,id = "X998_Y998",然後將識別碼和郵件 (為 msg) 。
選取 VALUE 標記
FROM 檔
JOIN 標記 IN 檔。標籤
ORDER BY docs._ts
__.chain ()
    .filter (函數 (檔) {
        退貨檔。Tags && Array.isArray (檔。標記) ;
    })
    .sortBy (函數 (檔) {
        返回doc._ts;
    })
    .pluck ("Tags")
    .flatten ()
    .value ()
篩選具有陣列屬性、標記的檔,然後根據 _ts 時間戳記系統屬性來排序結果檔,然後 projects + 將 Tags 陣列變平。

下一個步驟

深入瞭解 Azure 和 DB 中儲存的程式、觸發程式及使用者定義函數的撰寫Cosmos方法: