Help us understand the problem. What is going on with this article?

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

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の管理方法を見ていきます。(いつになるかは・・未定)

参照

https://docs.microsoft.com/bs-latn-ba/azure/cosmos-db/sql-query-udfs

syantien
トランスコスモス技術研究所にて様々な開発案件を進めています。最近はKotlin頑張ってます。開発メンバー絶賛採用中。このどれかのキーワードでビビっと来た人は面談にお越しください。「ASP.NET C#」, 「Kotlin」,「Swift」,「Angular」,「QA」,「UXデザイナー」,「データサイエンティスト」,「海外開発案件挑戦してみたい」,「Shopify」。
http://syantien.hatenablog.com/
trnd
ソフトウェア・ウェブサービス開発時に読み返せる記事をまとめています。
https://t-rnd.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした