CosmosDbは階層構造を持っているため必ずしもその層に値が定義されているとは限りません。今回はAzure Search用にデータをフラット化する際にその層に値が定義されてない場合(NULLの場合)処理の方法をカスタマイズしたい! そんな時のUDFです。
Azure Cosmos DB
Azure Cosmos DBに関しては下記の投稿を参照してください。
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の管理方法を見ていきます。(いつになるかは・・未定)
参照