LoginSignup
0
0

More than 3 years have passed since last update.

[DB] Azure Cosmos Db, User-defined functions UDF を使う

Posted at

CosmosDbは階層構造を持っているため必ずしもその層に値が定義されているとは限りません。今回はAzure Search用にデータをフラット化する際にその層に値が定義されてない場合(NULLの場合)処理の方法をカスタマイズしたい! そんな時のUDFです。

Azure Cosmos DB

Azure Cosmos DBに関しては下記の投稿を参照してください。
:point_right_tone2: Azure Cosmos DB 基礎編

(Cosmos DB) SQL APIでサポート

SQL API (Cosmos DBを作る際にSQL APIを指定した場合) はUDFをサポートしています。指定の処理を行い、一つの値を返すことによって、その返された値を1フィールド値として表現することができます。

サンプルコード(簡易版)

早速サンプルコードを見てみましょう。


UserDefinedFunction regexMatchUdf = new UserDefinedFunction
{
  Id = "REGEX_MATCH",
  Body = @"function (input, pattern) {
    return input.match(pattern) !== null;
  };",
};

UserDefinedFunction createdUdf = client.CreateUserDefinedFunctionAsync(
  UriFactory.CreateDocumentCollectionUri("myDatabase", "families"),
  regexMatchUdf).Result;  

SQLでの実装

フィールドの値として表示します。

SELECT udf.REGEX_MATCH(Families.address.city, ".*eattle")
FROM Families

フィルターとして実装することもできます。

SELECT Families.id, Families.address.city
FROM Families
WHERE udf.REGEX_MATCH(Families.address.city, ".*eattle")

サンプルコード(ちょっとアドバンス版)

下記のサンプルコードではより条件を複雑(カスタマイズ)したものになります。


UserDefinedFunction seaLevelUdf = new UserDefinedFunction()
{
  Id = "SEALEVEL",
  Body = @"function(city) {
    switch (city) {
      case 'Seattle':
        return 520;
      case 'NY':
        return 410;
      case 'Chicago':
        return 673;
      default:
        return -1;
    }
};

UserDefinedFunction createdUdf = await client.CreateUserDefinedFunctionAsync(
  UriFactory.CreateDocumentCollectionUri("myDatabase", "families"),
  seaLevelUdf);

SQLでの実装

SELECT f.address.city, udf.SEALEVEL(f.address.city) AS seaLevel
FROM Families f

次回はUDFの管理方法を見ていきます。(いつになるかは・・未定)

参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0